Sdílet prostřednictvím


Vytvoření objektu DataView (LINQ to DataSet)

Existují dva způsoby, jak vytvořit DataView v kontextu LINQ to DataSet. Můžete vytvořit DataView z dotazu LINQ to DataSet nad DataTable, nebo ho můžete vytvořit z typovaného nebo netypovaného DataTable. V obou případech vytvoříte DataView pomocí jedné z metod rozšíření AsDataView; DataView není přímo konstruktovatelný v kontextu LINQ to DataSet.

DataView Po vytvoření můžete vytvořit vazbu na ovládací prvek uživatelského rozhraní v aplikaci Windows Forms nebo v aplikaci ASP.NET nebo změnit nastavení filtrování a řazení.

DataView vytvoří index, který výrazně zvyšuje výkon operací, které mohou používat index, jako je filtrování a řazení. Index pro DataView se sestaví jak při vytvoření DataView, tak při úpravě některé z informací o řazení nebo filtrování. DataView Vytvoření a následné nastavení informací o řazení nebo filtrování později způsobí, že se index sestaví alespoň dvakrát: jednou po DataView vytvoření a znovu při úpravě některé vlastnosti řazení nebo filtru.

Další informace o filtrování a řazení pomocí DataView, naleznete v tématu Filtrování pomocí DataView a řazení pomocí DataView.

Vytvoření zobrazení dat z dotazu LINQ to DataSet

Objekt DataView lze vytvořit z výsledků dotazu LINQ to DataSet, kde jsou výsledky projekce DataRow objektů. Nově vytvořený DataView zdědí informace o filtrování a řazení z dotazu, ze které se vytvoří.

Poznámka:

Ve většině případů by výrazy použité pro filtrování a řazení neměly mít vedlejší účinky a musí být deterministické. Výrazy by také neměly obsahovat žádnou logiku, která závisí na nastaveném počtu spuštění, protože operace řazení a filtrování se můžou spouštět kolikrát.

Vytvoření DataView z dotazu, který vrací anonymní typy, nebo z dotazů provádějících operace spojení, není podporováno.

V dotazu použitém k vytvoření DataViewse podporují pouze následující operátory dotazu:

Všimněte si, že když je DataView vytvořen z dotazu LINQ to DataSet, metoda Select musí být tou poslední volanou metodou v dotazu. Toto je ukázáno v následujícím příkladu, který vytvoří DataView online objednávek seřazených podle celkové dlužné částky.

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

Pomocí vlastností řetězců RowFilter a Sort můžete také filtrovat a řadit DataView po jeho vytvoření z dotazu. Všimněte si, že tím vymažete informace o řazení a filtrování zděděné z dotazu. Následující příklad vytvoří DataView z dotazu LINQ to DataSet, který filtruje podle příjmení začínajících písmenem S. Vlastnost založená na Sort řetězci je nastavena tak, aby seřadil příjmení ve vzestupném pořadí a potom křestní jména v sestupném pořadí:

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"

Vytvoření zobrazení dat z datové tabulky

Kromě toho, že je objekt vytvořen z dotazu pomocí LINQ to DataSet, může být objekt vytvořen z DataView použitím metody DataTable.

Následující příklad vytvoří DataView z SalesOrderDetail tabulky a nastaví ji jako zdroj dat objektu BindingSource . Tento objekt funguje jako proxy pro DataGridView ovládací prvek.

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()

Filtrování a řazení lze nastavit na DataView poté, co byl vytvořen z DataTable. Následující příklad vytvoří DataView z tabulky Kontakt a nastaví vlastnost Sort k řazení podle příjmení ve vzestupném pořadí a pak podle křestních jmen v sestupném pořadí.

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()

Dojde však ke ztrátě výkonu, která nastane při nastavení vlastnosti RowFilter nebo Sort poté, co byl DataView vytvořen z dotazu, protože DataView vytváří index pro podporu operací filtrování a řazení. Nastavení vlastnosti RowFilter nebo Sort znovu sestaví index dat, přináší režii vaší aplikaci a snižuje výkon. Pokud je to možné, je lepší určit informace o filtrování a řazení při prvním vytvoření DataView a vyhnout se jejich následné úpravě.

Viz také