Linq操作与数据表

时间:2011-12-31 19:29:12

标签: c# asp.net linq datatable

我正在使用ADO.NET填充DataTable并绑定DataList并且它可以工作。但是,当我尝试使用DataTable中的Linq提取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有一列名为“照片”。我绑定到DataList时收到错误。请指导我如何使用Linq从DataTable中提取10条记录并将DataList与10条记录绑定。

我有另一个问题。

datatable.asEnumerable()的含义及其作用是什么?它似乎通过asEnumerable()将DataTable转换为什么?

1 个答案:

答案 0 :(得分:1)

DataTable实现了IListSource接口,它支持对列名进行数据绑定(因此Eval("photos")有效)。但是当您在AsEnumerable()上致电DataTable时,它会返回IEnumerable<DataRow>,其中DataRow个对象将没有名为photos的属性,这就是您获得的原因例外。但是,如果您在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>