Vytvoření objektu DataView (LINQ to DataSet)

Existují dva způsoby, jak vytvořit DataView kontext LINQ to DataSet. Můžete vytvořit DataView dotaz z LINQ to DataSet přes DataTable, nebo ho můžete vytvořit z typu nebo netypovaný DataTable. V obou případech vytvoříte DataView metodu pomocí jedné z AsDataView rozšiřujících metod; 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 objekt se DataView sestaví při DataView vytvoření i při úpravě některého 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.

DataView Vytvoření dotazu, který vrací anonymní typy nebo dotazy, které provádějí 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 při DataView vytvoření z LINQ to DataSet dotaz musí Select být metoda poslední metodou volanou v dotazu. To je vidět v následujícím příkladu, který vytvoří DataView online objednávky seřazené podle celkového termínu splnění:

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í řetězců RowFilter a Sort vlastností 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ě vytvoření z dotazu DataView LINQ to DataSet lze objekt vytvořit z DataTable AsDataView metody.

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 po DataView vytvoření z objektu DataTable. Následující příklad vytvoří DataView z tabulky Kontakt a nastaví Sort vlastnost řazení podle příjmení ve vzestupném pořadí a potom křestní jména 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á se dodává s nastavením RowFilter nebo vlastností po DataView vytvoření z dotazu, protože DataView vytváří index pro podporu operací Sort filtrování a řazení. RowFilter Nastavení nebo Sort vlastnosti znovu sestaví index dat, přidá režii vaší aplikace a sníží 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é