Ř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:
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