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 Language-Integrated Query (LINQ) 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 klauzuli OrderBy, OrderByDescending, ThenBy, nebo ThenByDescending, výrazy v těchto klauzulích 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 Sort nastaven po vytvoření DataView z dotazu, filtr odvozený z výrazu podle dotazu se vymaže a nelze jej obnovit.

Index pro DataView se sestaví jak při vytvoření DataView, tak při úpravě některé 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 pevném počtu spuštění, protože operace řazení se můžou spustit jakýkoli početkrát.

Příklad

Následující příklad dotazuje tabulku SalesOrderHeader a objednává vrácené řádky podle data objednávky; vytvoří DataView z tohoto dotazu; a naváže 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 řadí vrácené řádky podle celkové dlužné částky; vytvoří objekt DataView z tohoto dotazu; a váže 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 provádí dotaz na tabulku SalesOrderDetail a seřazuje vrácené řádky podle množství objednávky a následně podle ID prodejní objednávky; z tohoto dotazu vytvoří DataView a DataView naváže 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í String-Based

Funkce řazení založené na řetězcích DataView stále funguje s LINQ to DataSet. Po vytvoření DataView z dotazu LINQ to DataSet můžete nastavit řazení na objektu Sort pomocí vlastnosti 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 a seřadí řádky podle příjmení v sestupném pořadí, potom podle křestního jména 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". Z toho dotazu je vytvořen DataView a je přiřazen k objektu 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"

Zrušení ř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.

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

Příklad

Následující příklad vytvoří DataView z dotazu a odstraní nastavení řazení tím, že vlastnost Sort nastaví 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é