Linq операция с данными - PullRequest
       8

Linq операция с данными

2 голосов
/ 31 декабря 2011

Я заполняю DataTable, используя ADO.NET и связываю DataList, и он работает.Но когда я пытаюсь извлечь только 10 записей с помощью Linq из DataTable, как показано ниже, мой код выдает ошибку:

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 есть один столбец с именем photos.Я получаю сообщение об ошибке при привязке к списку данных.Пожалуйста, объясните мне, как я могу использовать Linq для извлечения 10 записей из DataTable и связывания DataList с 10 записями.

У меня есть еще один вопрос.

Что означает datatable.asEnumerable() и что он делает?Кажется, для преобразования DataTable с помощью asEnumerable (), но для чего?

1 Ответ

1 голос
/ 01 января 2012

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...