2011-12-31 60 views
2

我使用ADO.NET填充DataTable并绑定DataList,它可以工作。但是,当我尝试只提取10使用LINQ从数据表中的记录,如下图所示,我的代码给出了一个错误:使用数据表的LINQ操作

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转换为什么?

+0

关于你的最后一个问题是转换数据库集合(即IEnumerable的) – BlackBear 2011-12-31 19:31:25

+1

有什么异常,或者你得到的消息? – 2011-12-31 19:35:24

+0

没有找到名为“photo”的列 – 2011-12-31 19:47:12

回答

1

DataTable实现了IListSource接口,这是它支持数据绑定到列名称的方式(所以Eval("photos")工作)。但是,如果您在DataTable上致电AsEnumerable(),它将返回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> 
+0

谢谢我会尽力回到你身边。新年快乐。 – 2012-01-02 06:03:44