Tworzenie obiektu DataView (LINQ to DataSet)

Istnieją dwa sposoby tworzenia elementu DataView w kontekście LINQ to DataSet. Możesz utworzyć element DataView na podstawie zapytania LINQ to DataSet w obiekcie DataTablelub utworzyć go na podstawie wpisanego lub niepisanego DataTable. W obu przypadkach należy utworzyć obiekt DataView przy użyciu jednej z AsDataView metod rozszerzenia; DataView nie jest bezpośrednio konstruowany w kontekście LINQ to DataSet.

Po utworzeniu DataView elementu można powiązać go z kontrolką interfejsu użytkownika w aplikacji formularzy systemu Windows lub aplikacji ASP.NET albo zmienić ustawienia filtrowania i sortowania.

DataView tworzy indeks, który znacznie zwiększa wydajność operacji, które mogą używać indeksu, takiego jak filtrowanie i sortowanie. Indeks dla elementu DataView jest tworzony zarówno podczas DataView tworzenia, jak i gdy dowolny z informacji sortowania lub filtrowania jest modyfikowany. Utworzenie elementu DataView , a następnie ustawienie informacji sortowania lub filtrowania powoduje, że indeks zostanie skompilowany co najmniej dwa razy: raz po utworzeniu DataView , a następnie ponownie po zmodyfikowaniu dowolnych właściwości sortowania lub filtru.

Aby uzyskać więcej informacji na temat filtrowania i sortowania za pomocą DataViewmetody , zobacz Filtrowanie za pomocą widoku Danych i Sortowanie za pomocą elementu DataView.

Tworzenie elementu DataView na podstawie zapytania LINQ to DataSet

Obiekt DataView można utworzyć na podstawie wyników zapytania LINQ to DataSet, gdzie wyniki są projekcją DataRow obiektów. Nowo utworzony DataView dziedziczy informacje dotyczące filtrowania i sortowania z tworzonego zapytania.

Uwaga

W większości przypadków wyrażenia używane do filtrowania i sortowania nie powinny mieć skutków ubocznych i muszą być deterministyczne. Ponadto wyrażenia nie powinny zawierać żadnej logiki, która zależy od określonej liczby wykonań, ponieważ operacje sortowania i filtrowania mogą być wykonywane dowolną liczbę razy.

Tworzenie elementu DataView na podstawie zapytania zwracającego anonimowe typy lub zapytania wykonujące operacje sprzężenia nie jest obsługiwane.

Tylko następujące operatory zapytań są obsługiwane w zapytaniu używanym do utworzenia DataViewelementu :

Należy pamiętać, że po DataView utworzeniu elementu na podstawie zapytania Select LINQ to DataSet metoda musi być ostateczną metodą wywołaną w zapytaniu. Jest to pokazane w poniższym przykładzie, który tworzy DataView zamówienia online posortowane według całkowitej należności:

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

EnumerableRowCollection<DataRow> query =
    from order in orders.AsEnumerable()
    where order.Field<bool>("OnlineOrderFlag")
    orderby order.Field<decimal>("TotalDue")
    select order;

DataView view = query.AsDataView();

bindingSource1.DataSource = view;
Dim orders As DataTable = dataSet.Tables("SalesOrderHeader")

Dim query = _
    From order In orders.AsEnumerable() _
    Where order.Field(Of Boolean)("OnlineOrderFlag") = True _
    Order By order.Field(Of Decimal)("TotalDue") _
    Select order

Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view

Można również użyć właściwości opartych na RowFilter ciągach i Sort do filtrowania i sortowania DataView po jego utworzeniu na podstawie zapytania. Należy pamiętać, że spowoduje to wyczyszczenie informacji sortowania i filtrowania odziedziczonych po zapytaniu. W poniższym przykładzie utworzono zapytanie DataView LINQ to DataSet, które filtruje według nazwisk rozpoczynających się od "S". Właściwość oparta na Sort ciągach jest ustawiana na sortowanie według nazwisk w kolejności rosnącej, a następnie imię w kolejności malejącej:

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";
Dim contacts As DataTable = dataSet.Tables("Contact")

Dim query = _
    From contact In contacts.AsEnumerable() _
    Where contact.Field(Of String)("LastName").StartsWith("S") _
    Select contact

Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view
view.Sort = "LastName desc, FirstName asc"

Tworzenie elementu DataView na podstawie tabeli DataTable

Oprócz tworzenia na podstawie zapytania DataView LINQ to DataSet obiekt można utworzyć na podstawie DataTable obiektu przy użyciu AsDataView metody .

Poniższy przykład tworzy obiekt DataView z tabeli SalesOrderDetail i ustawia go jako źródło BindingSource danych obiektu. Ten obiekt działa jako serwer proxy dla kontrolki DataGridView .

DataTable orders = _dataSet.Tables["SalesOrderDetail"];

DataView view = orders.AsDataView();
bindingSource1.DataSource = view;

dataGridView1.AutoResizeColumns();
Dim orders As DataTable = dataSet.Tables("SalesOrderDetail")

Dim view As DataView = orders.AsDataView()
bindingSource1.DataSource = view
dataGridView1.AutoResizeColumns()

Filtrowanie i sortowanie można ustawić po jego utworzeniu DataView na podstawie elementu DataTable. Poniższy przykład tworzy obiekt DataView z tabeli Contact i ustawia Sort właściwość do sortowania według nazwisk w kolejności rosnącej, a następnie imię w kolejności malejącej:

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

DataView view = contacts.AsDataView();

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

bindingSource1.DataSource = view;
dataGridView1.AutoResizeColumns();
Dim contacts As DataTable = dataSet.Tables("Contact")

Dim view As DataView = contacts.AsDataView()

view.Sort = "LastName desc, FirstName asc"

bindingSource1.DataSource = view
dataGridView1.AutoResizeColumns()

Istnieje jednak utrata wydajności, która wiąże się z ustawieniem RowFilter właściwości lub Sort po utworzeniu DataView na podstawie zapytania, ponieważ DataView tworzy indeks do obsługi operacji filtrowania i sortowania. RowFilter Ustawienie właściwości or Sort ponownie kompiluje indeks danych, dodając obciążenie do aplikacji i zmniejszając wydajność. Jeśli to możliwe, lepiej jest określić informacje dotyczące filtrowania i sortowania podczas tworzenia DataView elementu i unikać ich późniejszego modyfikowania.

Zobacz też