我正在使用 ADO.NET 填充 DataTable 并绑定(bind) DataList 并且它有效。但是当我尝试使用 Linq 从 DataTable 中仅提取 10 条记录时,如下所示,我的代码给出了一个错误:
var xx=dt.asEnumerable().take(10).tolist();
dglist.datasource=xx;
dglist.databind();
<asp:DataList ID="dglist" runat="server"
RepeatColumns="4" RepeatDirection="Horizontal"
RepeatLayout="Table" CellPadding="1">
<ItemTemplate>
<div>
<asp:Image runat="server" id="Image1"
src='<%# Eval("photos") %>' BorderWidth="0"
alt="" style="width:300px;height:300px;display:block;"/>
</div>
</ItemTemplate>
</asp:DataList>
我的 DataTable 有一列名为“照片”。绑定(bind)到 DataList 时出现错误。请指导我如何使用 Linq 从 DataTable 中提取 10 条记录并将 DataList 与 10 条记录绑定(bind)。
我还有一个问题。
datatable.asEnumerable()
是什么意思,它有什么作用?它似乎通过 asEnumerable() 将 DataTable 转换为什么?
最佳答案
DataTable
实现 IListSource
接口(interface),即它支持数据绑定(bind)到列名的方式(因此 Eval("photos")
有效)。但是当你调用AsEnumerable()
在 DataTable
上它将返回 IEnumerable<DataRow>
DataRow在哪里对象不会有名为 photos
的属性这就是为什么你得到异常(exception)。但是如果你在你的 eval 中使用列名的索引器,你可以让它工作:
var xx = dt.AsEnumerable().Take(10).ToList();
dglist.DataSource = xx;
dglist.DataBind();
<asp:DataList ID="dglist" runat="server"
...
<asp:Image runat="server" id="Image1"
src='<%# Eval("[photos]") %>' BorderWidth="0"
alt="" style="width:300px;height:300px;display:block;"/>
...
</asp:DataList>
或者您使用 AsDataView()扩展方法。 OfType<object>()
需要将非泛型集合变为泛型集合以支持 LINQ。在这种情况下,您不需要在 Eval
中使用索引器。方法:
var xx = dt.AsDataView().OfType<object>().Take(10).ToList();
dglist.DataSource = xx;
dglist.DataBind();
<asp:DataList ID="dglist" runat="server"
....
<asp:Image runat="server" id="Image1"
src='<%# Eval("photos") %>' BorderWidth="0"
alt="" style="width:300px;height:300px;display:block;"/>
....
</asp:DataList>
关于c# - 数据表的Linq操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8690111/