Ordinamento con 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 dell'associazione dati. Con DataView è possibile ordinare i dati e restituire righe di dati ordinate in base a criteri specifici in diversi modi. Oltre alle funzionalità di ordinamento basate su stringhe, DataView consente anche di usare espressioni LINQ (Language-Integrated Query) per i criteri di ordinamento. Le espressioni LINQ consentono operazioni di ordinamento molto più complesse e potenti rispetto all’ordinamento basato su stringhe. In questo argomento vengono descritti entrambi gli approcci all'ordinamento tramite DataView.

Creazione di DataView da una query con informazioni di ordinamento

È possibile creare un oggetto DataView da una query LINQ to DataSet. Se tale query contiene una clausola OrderBy, OrderByDescending, ThenBy o ThenByDescending, le espressioni in tale clausola vengono usate come base per l'ordinamento dei dati di DataView. Se ad esempio la query contiene le clausole Order By… e Then By…, l'oggetto DataView risultante ordina i dati in base a entrambe le colonne specificate.

L'ordinamento basato su espressione è più potente e complesso rispetto a quello più semplice basato su stringa. Notare che l'ordinamento basato su stringa e l'ordinamento basato su espressione si escludono a vicenda. 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.

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. Per prestazioni ottimali è preferibile fornire i criteri di ordinamento nella query LINQ to DataSet da cui viene creato l'oggetto DataView ed evitare di modificare le informazioni sull'ordinamento in un secondo momento. Per altre informazioni, vedere Prestazioni di DataView.

Nota

Nella maggior parte dei casi le espressioni usate per l'ordinamento non devono presentare effetti collaterali e devono essere deterministiche. 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.

Esempio

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.

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

Esempio

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.

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

Esempio

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.

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

Utilizzo della proprietà per l'ordinamento basato su stringa

La funzionalità di ordinamento basato su stringa di DataView è ancora disponibile in LINQ to DataSet. Dopo aver creato un oggetto DataView da una query LINQ to DataSet, è possibile usare la proprietà Sort per impostare l'ordinamento su DataView.

Le funzionalità di ordinamento basato su stringa e di ordinamento basato su espressione si escludono a vicenda. L'impostazione della proprietà Sort implica la cancellazione dell'ordinamento basato su espressione ereditato dalla query da cui è stato creato l'oggetto DataView.

Per altre informazioni sul filtro Sort basato su stringhe, vedere Ordinamento e filtro dei dati.

Esempio

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:

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

Esempio

Nell'esempio seguente viene eseguita una query sulla tabella Contact per individuare i cognomi che iniziano per la lettera "S". Da tale query viene creato un oggetto DataView che viene associato a un oggetto 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"

Cancellazione dell'ordinamento

È possibile cancellare le informazioni sull'ordinamento relative a un oggetto DataView, impostate tramite la proprietà Sort. È possibile cancellare le informazioni sull'ordinamento in DataView in due modi diversi:

  • Impostare la proprietà Sort su null.

  • Impostare la proprietà Sort su una stringa vuota.

Esempio

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:

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

Esempio

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. Le informazioni sull'ordinamento vengono quindi cancellate impostando la proprietà Sort su 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

Vedi anche