2011-12-31 61 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