Ordinamento con DataView (LINQ to DataSet)Sorting with DataView (LINQ to DataSet)

La possibilità di ordinare i dati in base a criteri specifici e quindi di presentarli a un client tramite un controllo dell'interfaccia utente rappresenta un aspetto importante del data binding.The ability to sort data based on specific criteria and then present the data to a client through a UI control is an important aspect of data binding. Con DataView è possibile ordinare i dati e restituire righe di dati ordinate in base a criteri specifici in diversi modi.DataView provides several ways to sort data and return data rows ordered by specific ordering criteria. Oltre alla relativa stringa basata su funzionalità, di ordinamento DataView consente inoltre di utilizzare LINQ (Language-Integrated Query)Language-Integrated Query (LINQ) espressioni per i criteri di ordinamento.In addition to its string-based sorting capabilities, DataView also enables you to use LINQ (Language-Integrated Query)Language-Integrated Query (LINQ) expressions for the sorting criteria. LINQLINQ le espressioni consentono per le operazioni di ordinamento molto più complesse e potenti rispetto a ordinamento basato su stringa. expressions allow for much more complex and powerful sorting operations than string-based sorting. In questo argomento vengono descritti entrambi gli approcci all'ordinamento tramite DataView.This topic describes both approaches to sorting using DataView.

Creazione di DataView da una query con informazioni di ordinamentoCreating DataView from a Query with Sorting Information

È possibile creare un oggetto DataView da una query LINQ to DataSetLINQ to DataSet.A DataView object can be created from a LINQ to DataSetLINQ to DataSet query. Se la query contiene un OrderBy, OrderByDescending, ThenBy, o ThenByDescending le espressioni in tali clausole vengono utilizzate come base per l'ordinamento dei dati nella clausola di DataView.If that query contains an OrderBy, OrderByDescending, ThenBy, or ThenByDescending clause the expressions in these clauses are used as the basis for sorting the data in the DataView. Ad esempio, se la query contiene il Order By…e Then By… clausole, il valore risultante DataView Ordina i dati da entrambe le colonne specificate.For example, if the query contains the Order By…and Then By… clauses, the resulting DataView would order the data by both columns specified.

L'ordinamento basato su espressione è più potente e complesso rispetto a quello più semplice basato su stringa.Expression-based sorting offers more powerful and complex sorting than the simpler string-based sorting. Notare che l'ordinamento basato su stringa e l'ordinamento basato su espressione si escludono a vicenda.Note that string-based and expression-based sorting are mutually exclusive. Se si imposta un oggetto Sort basato su stringa dopo la creazione di un oggetto DataView da una query, il filtro basato sull'espressione dedotto dalla query viene cancellato e non può essere ripristinato.If the string-based Sort is set after a DataView is created from a query, the expression-based filter inferred from the query is cleared and cannot be reset.

L'indice relativo a un oggetto DataView viene compilato sia quando si crea DataView che quando si modifica una qualsiasi delle informazioni relative all'ordinamento o al filtraggio.The index for a DataView is built both when the DataView is created and when any of the sorting or filtering information is modified. Per prestazioni ottimali è preferibile fornire i criteri di ordinamento nella query LINQ to DataSetLINQ to DataSet da cui viene creato l'oggetto DataView ed evitare di modificare le informazioni sull'ordinamento in un secondo momento.You get the best performance by supplying sorting criteria in the LINQ to DataSetLINQ to DataSet query that the DataView is created from and not modifying the sorting information, later. Per ulteriori informazioni, vedere delle prestazioni di DataView.For more information, see DataView Performance.

Nota

Nella maggior parte dei casi le espressioni usate per l'ordinamento non devono presentare effetti collaterali e devono essere deterministiche.In most cases, the expressions used for sorting should not have side effects and must be deterministic. Le espressioni non devono inoltre contenere eventuale codice che dipende da un numero impostato di esecuzioni perché è possibile che le operazioni di ordinamento vengano eseguite un numero qualsiasi di volte.Also, the expressions should not contain any logic that depends on a set number of executions, because the sorting operations might be executed any number of times.

EsempioExample

Nell'esempio seguente viene eseguita una query sulla tabella SalesOrderHeader e le righe restituite vengono ordinate in base alla data dell'ordine. Viene quindi creato un oggetto DataView dalla query e l'oggetto DataView viene infine associato a BindingSource.The following example queries the SalesOrderHeader table and orders the returned rows by the order date; creates a DataView from that query; and binds the DataView to a 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

EsempioExample

Nell'esempio seguente viene eseguita una query sulla tabella SalesOrderHeader e le righe restituite vengono ordinate in base all'importo totale dovuto. Viene quindi creato un oggetto DataView dalla query e l'oggetto DataView viene infine associato a BindingSource.The following example queries the SalesOrderHeader table and orders the returned row by total amount due; creates a DataView from that query; and binds the DataView to a 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

EsempioExample

Nell'esempio seguente viene eseguita una query sulla tabella SalesOrderDetail e le righe restituite vengono ordinate prima in base alla quantità dell'ordine e quindi in base all'ID dell'ordine di vendita. Viene quindi creato un oggetto DataView dalla query e l'oggetto DataView viene infine associato a BindingSource.The following example queries the SalesOrderDetail table and orders the returned rows by order quantity and then by sales order ID; creates a DataView from that query; and binds the DataView to a BindingSource.

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

EnumerableRowCollection<DataRow> query = from order in orders.AsEnumerable()
                                         orderby order.Field<Int16>("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

Utilizzo della proprietà per l'ordinamento basato su stringaUsing the String-Based Sort Property

La funzionalità di ordinamento basato su stringa di DataView è ancora disponibile in LINQ to DataSetLINQ to DataSet.The string-based sorting functionality of DataView still works with LINQ to DataSetLINQ to DataSet. Dopo aver creato un oggetto DataView da una query LINQ to DataSetLINQ to DataSet, è possibile usare la proprietà Sort per impostare l'ordinamento su DataView.After a DataView has been created from a LINQ to DataSetLINQ to DataSet query, you can use the Sort property to set the sorting on the DataView.

Le funzionalità di ordinamento basato su stringa e di ordinamento basato su espressione si escludono a vicenda.The string-based and expression-based sorting functionality are mutually exclusive. L'impostazione della proprietà Sort implica la cancellazione dell'ordinamento basato su espressione ereditato dalla query da cui è stato creato l'oggetto DataView.Setting the Sort property will clear the expression-based sort inherited from the query that the DataView was created from.

Per ulteriori informazioni su basato su stringa Sort filtro, vedere ordinamento e filtraggio dei dati.For more information about string-based Sort filtering, see Sorting and Filtering Data.

EsempioExample

Nell'esempio seguente viene creato un oggetto DataView dalla tabella Contact e le righe vengono ordinate prima in base al cognome in ordine decrescente e quindi in base al nome in ordine crescente:The follow example creates a DataView from the Contact table and sorts the rows by last name in descending order, then first name in ascending order:

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()

EsempioExample

Nell'esempio seguente viene eseguita una query sulla tabella Contact per individuare i cognomi che iniziano per la lettera "S".The following example queries the Contact table for last names that start with the letter "S". Da tale query viene creato un oggetto DataView che viene associato a un oggetto BindingSource.A DataView is created from that query and bound to a 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"

Cancellazione dell'ordinamentoClearing the Sort

È possibile cancellare le informazioni sull'ordinamento relative a un oggetto DataView, impostate tramite la proprietà Sort.The sorting information on a DataView can be cleared after it has been set using the Sort property. È possibile cancellare le informazioni sull'ordinamento in DataView in due modi diversi:There are two ways to clear the sorting information in DataView:

  • Impostare la proprietà Sort su null.Set the Sort property to null.

  • Impostare la proprietà Sort su una stringa vuota.Set the Sort property to an empty string.

EsempioExample

Nell'esempio seguente viene creato un oggetto DataView da una query e viene quindi cancellato l'ordinamento impostando la proprietà Sort su una stringa vuota:The following example creates a DataView from a query and clears the sorting by setting the Sort property to an empty string:

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 = ""

EsempioExample

Nell'esempio seguente viene creato un oggetto DataView dalla tabella Contact e viene impostata la proprietà Sort per ordinare le righe in base al cognome in ordine decrescente.The following example creates a DataView from the Contact table and sets the Sort property to sort by last name in descending order. Le informazioni sull'ordinamento vengono quindi cancellate impostando la proprietà Sort su null:The sorting information is then cleared by setting the Sort property to 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

Vedere ancheSee Also

Data binding e LINQ to DataSetData Binding and LINQ to DataSet
Filtro con DataViewFiltering with DataView
Ordinamento dei datiSorting Data