Применение запросов LINQ к элементу управления EntityDataSource

Этот раздел описывает процесс фильтрации данных в элементе управления EntityDataSource во время выполнения с помощью запросов LINQ.

Начиная с версии .NET Framework 4, элемент управления EntityDataSource поддерживает элемент управления QueryExtender, используемый для создания фильтров для данных, извлеченных из источника. Управляющий элемент-расширитель запросов может использоваться для фильтрации данных в разметке веб-страницы с помощью декларативного синтаксиса. Дополнительные сведения см. в разделе Применение запросов LINQ к элементу управления EntityDataSource. Элемент управления EntityDataSource также позволяет фильтровать данные путем программного применения запросов LINQ to Entities в элементе ObjectQuery<T>, связанном с EntityDataSource, путем реализации обработчика событий QueryCreated. Для программной фильтрации данных добавление элемента управления QueryExtender на страницу не требуется. Управляющий элемент-расширитель запросов будет создан в тот момент, когда событие [ E:System.Web.UI.WebControls.EntityDataSource.QueryCreated] элемента управления EntityDataSource возвратит запрос, отличный от запроса, переданного в событие.

Запрос LINQ может указывать на дополнительную фильтрацию для элемента управления EntityDataSource во время выполнения путем реализации обработчика событий EntityDataSource.QueryCreated. Событие QueryCreated возникает после того, как EntityDataSource завершает создание запроса Entity SQL, указанного при настройке элемента управления EntityDataSource. Чтобы применить запрос LINQ дополнительно к исходному запросу, предоставленному элементом управления EntityDataSource, назначьте запрос LINQ параметру e.Query, который передается в обработчик событий. Итоговый тип запроса, назначаемого параметру e.Query, должен совпадать с возвращаемым типом, указанным при создании элемента управления. В противном случае возникнет исключение.

В следующем примере поле со списком привязано к элементу управления EntityDataSource, а событие onquerycreated связано с обработчиком событий EntityDataSource1_QueryCreated.

<asp:ListBox ID="ListBox1" runat="server" DataSourceID="EntityDataSource1" 
    DataTextField="SalesOrderID" DataValueField="SalesOrderID"></asp:ListBox>
<asp:EntityDataSource ID="EntityDataSource1" runat="server" 
    ConnectionString="name=AdventureWorksEntities" 
    DefaultContainerName="AdventureWorksEntities" EnableFlattening="False" 
    EntitySetName="SalesOrderHeaders" 
    onquerycreated="EntityDataSource1_QueryCreated">
</asp:EntityDataSource>

Обработчик событий, реализующий событие QueryCreated, добавляет запрос LINQ к элементу управления EntityDataSource, который отображает заказы с идентификаторами меньше 43661:

protected void EntityDataSource1_QueryCreated(object sender, QueryCreatedEventArgs e)
{
    var orders = e.Query.Cast<SalesOrderHeader>();
    e.Query = from order in orders
        where order.SalesOrderID < 43661
        select order;  
}

Элемент управления EntityDataSource применит к данным выражения сортировки и разбиения на страницы из поля с привязкой к данным после выполнения запросов Entity SQL и LINQ.

Порядок ресурсов зависит от трех различных источников, которые применяются в следующей последовательности:

  • Свойства OrderBy и AutoGenerateOrderByClause элемента EntityDataSource.

  • Порядок, указанный в запросе LINQ или QueryExtender при выполнении QueryCreated.

  • Порядок, указанный в выражении сортировки элемента с привязкой к данным.

Так как каждая применяемая к запросу спецификация переопределяет все предыдущие спецификации, то только последняя спецификация будет влиять на результаты, а операции разбиения на страницы будут применяться позже.

Показ: