Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Разработка приложений баз данных (Visual Studio 2008).docx
Скачиваний:
143
Добавлен:
26.03.2016
Размер:
1.01 Mб
Скачать

Создание объекта DataView (linq to DataSet)

LINQ to DataSet позволяет разработчикам создавать сложные и мощные запросы для DataSetс помощью LINQ. Запрос LINQ to DataSet возвращает перечисление объектовDataRow, использование которого в сценарии привязки, является, тем не менее, непростой задачей. Объект DataView может быть создан из запроса LINQ to DataSet, воспринимая характеристики сортировки и фильтрации этого запроса. LINQ to DataSet расширяет функциональные возможности DataView, обеспечивая фильтрацию и сортировку на основе выражения LINQ, позволяющего выполнять гораздо более сложные и мощные операции сортировки и фильтрации по сравнению с сортировкой и фильтрацией на основе строки. Дополнительные сведения см. в разделеСвязывание с данными и LINQ to DataSet.

Объект DataViewв контексте LINQ to DataSet можно создать двумя способами. Можно создать объектDataViewна основе запроса LINQ to DataSet к таблицеDataTableили на основе типизированной или нетипизированной таблицыDataTable. В обоих случаях объектDataViewсоздается с помощью одного из методов расширенийAsDataView;объект DataView нельзя напрямую создать в контексте LINQ to DataSet.

После создания объекта DataViewего можно привязать к элементу управления в пользовательском интерфейсе приложения Windows Forms или ASP.NET либо изменить параметры фильтрации и сортировки.

Объект DataViewсоздает индекс, значительно повышающий производительность операций, использующих этот индекс, таких как фильтрация и сортировка. Индекс дляDataViewформируется как при созданииDataView, так и при изменении каких-либо сведений о сортировке или фильтрации. СозданиеDataViewи последующее задание сведений о сортировке или фильтрации приводит как минимум к двукратному построению индекса — при созданииDataViewи при изменении каких-либо свойств сортировки или фильтрации.

Дополнительные сведения о фильтрации и сортировке с помощью DataViewсм. в разделахФильтрация с помощью DataView (LINQ to DataSet)иСортировка с помощью DataView (LINQ to DataSet).

Создание объекта DataView на основе запроса linq to DataSet

Объект DataViewможно создать на основе результатов запроса LINQ to DataSet, которые являются проекцией объектовDataRow. Созданный объектDataViewнаследует сведения о фильтрации и сортировке из запроса, на основе которого он был создан.

Примечание

В большинстве случаев выражение, используемое для фильтрации и сортировки, не должно иметь побочных эффектов и должно быть детерминированным. Также эти выражения не должны содержать логику, зависящую от заданного количества выполнений, так как операции фильтрации и сортировки могут выполняться любое количество раз.

Не поддерживается создание объектов DataViewна основе запросов, возвращающих анонимные типы, или запросов, содержащих операции соединения.

В запросах, на основе которых создаются объекты DataView, поддерживаются только следующие операторы запросов.

  • Cast<(Of <(TResult>)>)

  • OrderBy

  • OrderByDescending

  • Select<(Of <(TRow, S>)>)

  • ThenBy

  • ThenByDescending

  • Where<(Of <(TRow>)>)

Обратите внимание, что при создании объекта DataViewна основе запроса LINQ to DataSet методSelect<(Of <(TRow, S>)>)должен являться завершающим методом, вызываемым в запросе. Это показано в следующем примере, иллюстрирующем создание объектаDataViewиз совершенных через Интернет заказов, отсортированных по сумме заказа.

DataTable orders = dataSet.Tables["SalesOrderHeader"];

EnumerableRowCollection<DataRow> query =

from order in orders.AsEnumerable()

where order.Field<bool>("OnlineOrderFlag") == true

orderby order.Field<decimal>("TotalDue")

select order;

DataView view = query.AsDataView();

bindingSource1.DataSource = view;

Также для фильтрации и сортировки объекта DataViewпосле его создания из запроса можно использовать строковые свойстваRowFilterиSort. Обратите внимание, что при этом сведения о сортировке и фильтрации, унаследованные из запроса, будут удалены. В следующем примере показано создание объектаDataViewна основе запроса LINQ to DataSet, выполняющего фильтрацию по фамилиям, начинающимся с буквы «С». Строковое свойствоSortзадает сортировку по фамилиям в возрастающем порядке, а затем по именам в убывающем порядке:

C#

DataTable contacts = dataSet.Tables["Contact"];

EnumerableRowCollection<DataRow> query = from contact in contacts.AsEnumerable()

where contact.Field<string>("LastName").StartsWith("S")

select contact;

DataView view = query.AsDataView();

bindingSource1.DataSource = view;

view.Sort = "LastName desc, FirstName asc";

В следующем примере создается объект DataView для заказов через Интернет, упорядоченных по итоговой сумме:

DataTable orders = dataSet.Tables["SalesOrderHeader"];

EnumerableRowCollection<DataRow> query =

from order in orders.AsEnumerable()

where order.Field<bool>("OnlineOrderFlag") == true

orderby order.Field<decimal>("TotalDue")

select order;

DataView view = query.AsDataView();

bindingSource1.DataSource = view;

AsDataView