Creazione di un oggetto DataView (LINQ to DataSet)

Esistono due modi per creare un oggetto DataView nel contesto LINQ to DataSet. È possibile creare un oggetto DataView da una query LINQ to DataSet su DataTable oppure da un oggetto DataTable tipizzato o non tipizzato. In entrambi i casi, l'oggetto DataView viene creato usando uno dei metodi di estensione AsDataView; non è possibile costruire DataView direttamente nel contesto LINQ to DataSet.

Dopo aver creato DataView, è possibile associarlo a un controllo dell'interfaccia utente in un'applicazione Windows Forms o ASP.NET oppure modificare le impostazioni di filtro e ordinamento.

DataView costruisce un indice, offrendo un significativo incremento delle prestazioni nel caso di operazioni in cui è possibile usare l'indice, ad esempio ordinamento e filtro. 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. Se si crea un oggetto DataView e quindi si impostano le impostazioni sull'ordinamento o il filtraggio in un secondo momento, l'indice verrà compilato almeno due volte, ovvero una volta durante la creazione di DataView e una seconda volta quando viene modificata una qualsiasi delle proprietà di ordinamento o filtro.

Per altre informazioni sull'applicazione di filtri e sull'ordinamento con DataView, vedere Filtro con DataView e Ordinamento con DataView.

Creazione di una DataView da una query LINQ to DataSet

Un oggetto DataView può essere creato dai risultati di una query LINQ to DataSet, in cui i risultati sono una proiezione di oggetti DataRow. Il nuovo oggetto DataView eredita le informazioni di filtro e ordinamento della query da cui è stato creato.

Nota

Nella maggior parte dei casi le espressioni usate per il filtro e 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 e filtro vengano eseguite un numero qualsiasi di volte.

La creazione di DataView da una query che restituisce tipi anonimi o da query che eseguono operazioni join non è supportata.

In una query usata per creare DataView sono supportati solo i seguenti operatori di query:

Si noti che quando viene creato un oggetto DataView da una query LINQ to DataSet, il metodo Select deve essere il metodo finale chiamato nella query, come illustrato nell'esempio seguente, in cui viene creato un oggetto DataView di ordini online ordinati in base al totale dovuto:

DataTable orders = _dataSet.Tables["SalesOrderHeader"];

EnumerableRowCollection<DataRow> query =
    from order in orders.AsEnumerable()
    where order.Field<bool>("OnlineOrderFlag")
    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() _
    Where order.Field(Of Boolean)("OnlineOrderFlag") = True _
    Order By order.Field(Of Decimal)("TotalDue") _
    Select order

Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view

È anche possibile usare le proprietà RowFilter e Sort basate su stringa per filtrare e ordinare un oggetto DataView creato da una query. Si noti che in questo caso le informazioni di ordinamento e di filtro ereditate dalla query verranno cancellate. Nell'esempio seguente viene creato un oggetto DataView da una query LINQ to DataSet che filtra i contatti in base ai cognomi che iniziano con 'S'. La proprietà Sort basata su stringa è impostata per ordinare i cognomi in ordine crescente e quindi i nomi in ordine decrescente:

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"

Creazione di una DataView da una DataTable

Oltre che da una query LINQ to DataSet, un oggetto DataView può essere creato da DataTable usando il metodo AsDataView.

Nell'esempio seguente viene creato un oggetto DataView dalla tabella SalesOrderDetail e viene impostato come origine dati di un oggetto BindingSource. L'oggetto funge da proxy per un controllo DataGridView.

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

DataView view = orders.AsDataView();
bindingSource1.DataSource = view;

dataGridView1.AutoResizeColumns();
Dim orders As DataTable = dataSet.Tables("SalesOrderDetail")

Dim view As DataView = orders.AsDataView()
bindingSource1.DataSource = view
dataGridView1.AutoResizeColumns()

Dopo la creazione dell'oggetto DataView da DataTable, è possibile specificare le impostazioni di filtro e ordinamento. Nell'esempio seguente viene creato un oggetto DataView dalla tabella Contact e la proprietà Sort viene impostata in modo da ordinare i cognomi in ordine crescente e quindi i nomi in ordine decrescente:

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

Se tuttavia la proprietà RowFilter o Sort viene impostata dopo la creazione di DataView da una query, si verifica un decremento delle prestazioni perché DataView costruisce un indice per supportare le operazioni di filtro e ordinamento. L'impostazione della proprietà RowFilter o Sort provoca una ricompilazione dell'indice dei dati, aggiungendo un sovraccarico all'applicazione e riducendo le prestazioni. Se possibile, è preferibile specificare le impostazioni di filtro e ordinamento la prima volta che viene creato l'oggetto DataView ed evitare di modificarle in seguito.

Vedi anche