Sdílet prostřednictvím


Řazení pomocí DataView (LINQ to DataSet)

Schopnost řadit data na základě konkrétních kritérií a pak je prezentovat klientovi prostřednictvím ovládacího prvku uživatelského rozhraní, je důležitým aspektem datové vazby. DataView poskytuje několik způsobů řazení dat a vrácení řádků dat seřazených podle konkrétních kritérií řazení. Kromě možností řazení založeného na řetězcích DataView umožňuje také používat výrazy LINQ (Language-Integrated Query) pro kritéria řazení. Výrazy LINQ umožňují mnohem složitější a výkonnější operace řazení než řazení založené na řetězcích. Toto téma popisuje oba přístupy k řazení pomocí DataView.

Vytvoření zobrazení dat z dotazu s informacemi o řazení

Objekt DataView lze vytvořit z dotazu LINQ to DataSet. Pokud tento dotaz obsahuje výrazy OrderByv těchto klauzulích , OrderByDescendingThenBynebo ThenByDescending klauzule, jsou použity jako základ pro řazení dat v objektu DataView. Pokud například dotaz obsahuje Order By…klauzule a Then By… klauzule, výsledek DataView by data uspořádala podle obou zadaných sloupců.

Řazení založené na výrazech nabízí výkonnější a složitější řazení než jednodušší řazení založené na řetězcích. Všimněte si, že řazení založené na řetězcích a výrazech se vzájemně vylučují. Pokud je řetězec nastavený Sort po DataView vytvoření z dotazu, filtr založený na výrazech odvozený z dotazu se vymaže a nedá se resetovat.

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í. Nejlepší výkon získáte zadáním kritérií řazení v dotazu LINQ to DataSet, ze kterého DataView se vytvoří, a později neupravíte informace o řazení. Další informace naleznete v tématu Výkon dataView.

Poznámka:

Ve většině případů by výrazy použité pro ř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í se můžou spustit libovolný počet.

Příklad

Následující příklad dotazuje tabulku SalesOrderHeader a objednává vrácené řádky podle data objednávky; vytvoří z dotazu a DataView vytvoří vazbu DataView na .BindingSource

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

EnumerableRowCollection<DataRow> query = from order in orders.AsEnumerable()
                                         orderby order.Field<DateTime>("OrderDate")
                                         select order;

DataView view = query.AsDataView();

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

Dim query = _
    From order In orders.AsEnumerable() _
    Order By order.Field(Of DateTime)("OrderDate") _
    Select order

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

Příklad

Následující příklad dotazuje tabulku SalesOrderHeader a objednává vrácený řádek podle celkové částky splatnosti; vytvoří z dotazu a DataView vytvoří vazbu DataView na .BindingSource

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

EnumerableRowCollection<DataRow> query =
    from order in orders.AsEnumerable()
    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() _
    Order By order.Field(Of Decimal)("TotalDue") _
    Select order

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

Příklad

Následující příklad dotazuje tabulku SalesOrderDetail a objednává vrácené řádky podle množství objednávky a pak podle ID prodejní objednávky; vytvoří z dotazu a DataView vytvoří vazbu DataView na .BindingSource

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

EnumerableRowCollection<DataRow> query = from order in orders.AsEnumerable()
                                         orderby order.Field<short>("OrderQty"), order.Field<int>("SalesOrderID")
                                         select order;

DataView view = query.AsDataView();

bindingSource1.DataSource = view;

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

Dim query = _
    From order In orders.AsEnumerable() _
    Order By order.Field(Of Int16)("OrderQty"), order.Field(Of Integer)("SalesOrderID") _
    Select order

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

Použití vlastnosti řazení na základě řetězců

Funkce řazení založené na řetězcích DataView stále funguje s LINQ to DataSet. DataView Po vytvoření dotazu LINQ to DataSet můžete pomocí Sort vlastnosti nastavit řazení na objektu DataView.

Funkce řazení založené na řetězcích a výrazech se vzájemně vylučují. Sort Nastavení vlastnosti vymaže řazení na základě výrazu zděděné z dotazu, ze kterého DataView byl vytvořen.

Další informace o filtrování založeném na Sort řetězcích najdete v tématu Řazení a filtrování dat.

Příklad

Následující příklad vytvoří DataView z tabulky Kontakt tabulku a seřadí řádky podle příjmení v sestupném pořadí a potom křestní jméno ve vzestupné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()

Příklad

Následující příklad dotazuje tabulku Kontaktů na příjmení, která začínají písmenem "S". Vytvoří DataView se z dotazu a je svázán s objektem BindingSource .

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"

Vymazání řazení

Informace o řazení na objektu DataView lze po nastavení pomocí Sort vlastnosti vymazat. Informace o řazení DataViewmůžete vymazat dvěma způsoby:

  • Nastavte vlastnost Sort na null.

  • Sort Nastavte vlastnost na prázdný řetězec.

Příklad

Následující příklad vytvoří DataView z dotazu a vymaže řazení nastavením Sort vlastnosti na prázdný řetězec:

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

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

DataView view = query.AsDataView();

bindingSource1.DataSource = view;

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

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

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

Příklad

Následující příklad vytvoří DataView z tabulky Kontakt a nastaví Sort vlastnost řazení podle příjmení v sestupném pořadí. Informace o řazení se pak vymažou nastavením Sort vlastnosti na null:

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

DataView view = contacts.AsDataView();

view.Sort = "LastName desc";

bindingSource1.DataSource = view;
dataGridView1.AutoResizeColumns();

// Clear the sort.
view.Sort = null;
Dim contacts As DataTable = dataSet.Tables("Contact")

Dim view As DataView = contacts.AsDataView()
view.Sort = "LastName desc"

bindingSource1.DataSource = view
dataGridView1.AutoResizeColumns()

'Clear the sort.
view.Sort = Nothing

Viz také