Sorteren met DataView (LINQ naar DataSet)
De mogelijkheid om gegevens te sorteren op basis van specifieke criteria en de gegevens vervolgens aan een client te presenteren via een UI-besturingselement, is een belangrijk aspect van gegevensbinding. DataView biedt verschillende manieren om gegevens te sorteren en gegevensrijen te retourneren die zijn gerangschikt op specifieke volgordecriteria. Naast de sorteermogelijkheden op basis van tekenreeksen kunt DataView u ook LINQ-expressies (Language-Integrated Query) gebruiken voor de sorteercriteria. LINQ-expressies bieden veel complexere en krachtige sorteerbewerkingen dan sorteren op basis van tekenreeksen. In dit onderwerp worden beide methoden beschreven voor het sorteren met behulp van DataView.
DataView maken op basis van een query met sorteergegevens
Een DataView object kan worden gemaakt van een LINQ naar DataSet-query. Als die query een OrderBy, OrderByDescendingof ThenByThenByDescending component bevat, worden de expressies in deze componenten gebruikt als basis voor het sorteren van de gegevens in de DataView. Als de query bijvoorbeeld de Order By…
en Then By…
componenten bevat, DataView worden de gegevens gesorteerd op beide opgegeven kolommen.
Sorteren op basis van expressies biedt krachtigere en complexere sortering dan het eenvoudiger sorteren op basis van tekenreeksen. Houd er rekening mee dat sorteren op basis van tekenreeksen en expressies elkaar uitsluiten. Als de tekenreeks Sort is ingesteld nadat een DataView query is gemaakt, wordt het filter op basis van expressies uit de query gewist en kan het niet opnieuw worden ingesteld.
De index voor een DataView wordt gemaakt, zowel wanneer de DataView gegevens worden gemaakt als wanneer een van de sorteer- of filtergegevens wordt gewijzigd. U krijgt de beste prestaties door sorteercriteria in de LINQ op te geven aan de DataSet-query waaruit de DataView query is gemaakt en de sorteergegevens later niet te wijzigen. Zie DataView-prestaties voor meer informatie.
Notitie
In de meeste gevallen mogen de expressies die worden gebruikt voor sorteren, geen bijwerkingen hebben en moeten ze deterministisch zijn. De expressies mogen ook geen logica bevatten die afhankelijk is van een vast aantal uitvoeringen, omdat de sorteerbewerkingen mogelijk een willekeurig aantal keren worden uitgevoerd.
Opmerking
In het volgende voorbeeld wordt een query uitgevoerd op de tabel SalesOrderHeader en worden de geretourneerde rijen gesorteerd op de orderdatum; maakt een DataView van die query en verbindt de DataView met een 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
Opmerking
In het volgende voorbeeld wordt een query uitgevoerd op de tabel SalesOrderHeader en wordt de geretourneerde rij gesorteerd op totale verschuldigde hoeveelheid; maakt een DataView van die query en verbindt de DataView met een 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
Opmerking
In het volgende voorbeeld wordt een query uitgevoerd op de tabel SalesOrderDetail en worden de geretourneerde rijen gesorteerd op orderhoeveelheid en vervolgens op verkooporder-id; maakt een DataView van die query en verbindt de DataView met een 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
De sorteereigenschap op basis van tekenreeksen gebruiken
De sorteerfunctionaliteit op basis van tekenreeksen werkt DataView nog steeds met LINQ naar DataSet. Nadat een DataView linq is gemaakt op basis van een LINQ naar DataSet-query, kunt u de Sort eigenschap gebruiken om de sortering op de DataViewquery in te stellen.
De sorteerfunctionaliteit op basis van tekenreeksen en expressies sluiten elkaar wederzijds uit. Als u de Sort eigenschap instelt, wordt de op expressies gebaseerde sortering gewist die is overgenomen van de query waaruit de DataView eigenschap is gemaakt.
Zie Gegevens sorteren en filteren voor meer informatie over filteren op basis van Sort tekenreeksen.
Opmerking
In het volgende voorbeeld wordt een DataView uit de tabel Contactpersoon gemaakt en worden de rijen gesorteerd op achternaam in aflopende volgorde en vervolgens de voornaam in oplopende volgorde:
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()
Opmerking
In het volgende voorbeeld wordt een query uitgevoerd op de tabel Contactpersoon voor achternamen die beginnen met de letter 'S'. Er DataView wordt een gemaakt op basis van die query en gebonden aan een BindingSource object.
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"
De sortering wissen
De sorteerinformatie op een DataView kan worden gewist nadat deze is ingesteld met behulp van de Sort eigenschap. U kunt de sorteergegevens op twee manieren wissen in DataView:
Opmerking
In het volgende voorbeeld wordt een DataView query gemaakt en wordt de sortering gewist door de Sort eigenschap in te stellen op een lege tekenreeks:
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 = ""
Opmerking
In het volgende voorbeeld wordt een DataView uit de tabel Contactpersoon gemaakt en wordt de Sort eigenschap ingesteld op achternaam in aflopende volgorde. De sorteergegevens worden vervolgens gewist door de Sort eigenschap in te stellen op 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