Sortera med DataView (LINQ till DataSet)
Möjligheten att sortera data baserat på specifika kriterier och sedan presentera data för en klient via en användargränssnittskontroll är en viktig aspekt av databindningen. DataView innehåller flera sätt att sortera data och returnera datarader ordnade efter specifika ordningsvillkor. Förutom dess strängbaserade sorteringsfunktioner DataView kan du även använda LINQ-uttryck (Language-Integrated Query) för sorteringsvillkoren. LINQ-uttryck möjliggör mycket mer komplexa och kraftfulla sorteringsåtgärder än strängbaserad sortering. Det här avsnittet beskriver båda metoderna för sortering med hjälp av DataView.
Skapa DataView från en fråga med sorteringsinformation
Ett DataView objekt kan skapas från en LINQ till DataSet-fråga. Om frågan innehåller en OrderBy, OrderByDescending, ThenByeller ThenByDescending -sats används uttrycken i dessa satser som grund för sortering av data i DataView. Om frågan till exempel innehåller Order By…
- och-satserna Then By…
, skulle resultatet DataView sortera data efter båda kolumnerna som angetts.
Uttrycksbaserad sortering erbjuder kraftfullare och mer komplex sortering än enklare strängbaserad sortering. Observera att strängbaserad och uttrycksbaserad sortering är ömsesidigt uteslutande. Om strängbaserad Sort anges efter att en DataView har skapats från en fråga rensas det uttrycksbaserade filter som härleds från frågan och kan inte återställas.
Indexet för en DataView skapas både när det DataView skapas och när någon av sorterings- eller filtreringsinformationen ändras. Du får bästa möjliga prestanda genom att ange sorteringsvillkor i LINQ till DataSet-frågan som DataView skapas från och inte ändra sorteringsinformationen senare. Mer information finns i DataView-prestanda.
Kommentar
I de flesta fall bör de uttryck som används för sortering inte ha biverkningar och måste vara deterministiska. Dessutom bör uttrycken inte innehålla någon logik som är beroende av ett visst antal körningar, eftersom sorteringsåtgärderna kan köras ett antal gånger.
Exempel
Följande exempel frågar tabellen SalesOrderHeader och beställer de returnerade raderna efter orderdatumet. skapar en DataView från den frågan och binder DataView till en 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
Exempel
Följande exempel frågar tabellen SalesOrderHeader och beställer den returnerade raden efter det totala förfallna beloppet. skapar en DataView från den frågan och binder DataView till en 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
Exempel
Följande exempel frågar tabellen SalesOrderDetail och beställer de returnerade raderna efter orderkvantitet och sedan efter försäljningsorder-ID. skapar en DataView från den frågan och binder DataView till en 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
Använda egenskapen Strängbaserad sortering
Den strängbaserade sorteringsfunktionen DataView i fungerar fortfarande med LINQ till DataSet. När en DataView har skapats från en LINQ till DataSet-fråga kan du använda Sort egenskapen för att ange sortering på DataView.
De strängbaserade och uttrycksbaserade sorteringsfunktionerna är ömsesidigt uteslutande. Om du Sort anger egenskapen rensas den uttrycksbaserade sortering som ärvts från frågan som DataView skapades från.
Mer information om strängbaserad Sort filtrering finns i Sortera och filtrera data.
Exempel
Följande exempel skapar en DataView från tabellen Kontakt och sorterar raderna efter efternamn i fallande ordning och sedan förnamn i stigande ordning:
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()
Exempel
I följande exempel frågas tabellen Kontakt efter efternamn som börjar med bokstaven "S". En DataView skapas från den frågan och binds till ett BindingSource objekt.
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"
Rensa sortering
Sorteringsinformationen på en DataView kan rensas när den har angetts med hjälp av Sort egenskapen . Det finns två sätt att rensa sorteringsinformationen i DataView:
Exempel
I följande exempel skapas en DataView från en fråga och sortering rensas genom att egenskapen anges Sort till en tom sträng:
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 = ""
Exempel
I följande exempel skapas en DataView från tabellen Kontakt och egenskapen sorteras Sort efter efternamn i fallande ordning. Sorteringsinformationen rensas sedan genom att egenskapen anges Sort till 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