Introduzione a LINQ

di: Giuseppe Marchi     20 Febbraio 2008

LINQ to DataSet

Questa terza implementazione offre un linguaggio di semplice selezione su strutture salvate in memoria, che rappresentano delle informazioni secondo il modello relazionale, quindi DataSet, DataTable e DataRow utilizzando i nuovi operatori propri della sintassi LINQ (in questo caso specifico, la creazione di nuove strutture non è stata prevista).

Considerando che, effettivamente, la selezione viene fatta su oggetti di tipo DataTable, l'unico passo che dobbiamo compiere prima di scrivere le nostre query secondo la sintassi LINQ è quello di trasformare il tipo di questi oggetti in un tipo che vada "a braccetto" con LINQ (per esempio l'interfaccia IEnumerable). Questa operazione si occupa di portarla a termine il metodo AsEnumerable(), inserito con la tecnica degli extension methods proprio all'interno della classe DataTable. Fatto questo, siamo in grado di eseguire le nostre query sulla struttura dati in memoria, con una sintassi molto simile al linguaggio SQL:

(C#)

var query = from r in ds.Tables[0].AsEnumerable()
            where r.Field<DateTime>("CampoData").Year == 2008
            select r.Field<string>("CampoSelezionato");

(VB.NET)

Dim query = From r In ds.Tables(0).AsEnumerable() _
            Where r.Field(Of DateTime)("CampoData").Year = 2008 _
            Select r.Field(Of String)("CampoSelezionato")

Nella query d'esempio abbiamo selezionato un singolo campo da una tabella presente in un DataSet (ds) ponendo la condizione che il campo CampoData, di tipo DateTime, essere dell'anno 2008.

Utilissimo risulta quindi il metodo generico Field() che permette di evitare errori di null reference a fronte di casting su tipi specifici.

Per poter selezionare invece più colonne nella nostra query, dobbiamo sempre rifarci all'utilizzo della tecnica dei tipi anonimi:

(C#)

var query2 = from r in ds.Tables[0].AsEnumerable()
             where r.Field<DateTime>("Data").Year == 2008
             select new
             {
                 Titolo = r.Field<string>("Titolo"),
                 Data = r.Field<DateTime>("Data")
             };

(VB.NET)

Dim query2 = From r In ds.Tables(0).AsEnumerable() _
             Where r.Field(Of DateTime)("Data").Year = 2008 _
             Select Titolo = r.Field(Of String)("Titolo"), _
                    Data = r.Field(Of DateTime)("Data")

Inoltre, LINQ to DataSet supporta selezioni sia su normali DataSet (come abbiamo appena visto) che su DataSet tipizzati, in cui risulta sicuramente molto più semplice la scelta dei vari campi della tabella e in cui non è necessaria la chiamata al metodo AsEnumerable(), in quando ogni DataSet tipizzato deriva già di per sé dall'interfaccia IEnumerable.

(C#)

CustomersTableAdapter adapter = new CustomersTableAdapter();

TypedDataSet.CustomersDataTable customers = adapter.GetData();

var result = from r in customers
             where r.IsCityNull() == false && r.City == "London"
             orderby r.ContactName
             select r;

(VB.NET)

Dim adapter As New CustomersTableAdapter()

Dim customers As TypedDataSet.CustomersDataTable = adapter.GetData()

Dim result = From r In customers _
             Where r.IsCityNull() = False And r.City = "London" _
             Order By r.ContactName _
             Select r

In poche parole, se avete fatto bene caso agli esempi appena visti, questa implementazione di LINQ non diverge molto da LINQ to Objects; cambia semplicemente il fatto che le fonti di dati prese in considerazione per le nostre query sono degli oggetti in memoria di tipo DataTable.

Guide ASP.Net

Guida Windows Azure Code Snippets

Le migliori pratiche per far girare le applicazioni "in the cloud",...

Guida ASP.NET MVC Best Practices

Un workflow dettagliato e ricco di suggerimenti pratici per...

Guida ASP.NET Starter Kit

Un modo semplice per imparare ad utilizzare le tecnologie Microsoft...

Altre guide

Newsletter @Microsoft Dev

Ogni giovedì, direttamente nella tua e-mail: articoli, guide, tutorial e script ASP, ASP.Net, SQL server e IIS.

Iscriviti alla newsletter

Altre newsletter

Corsi in aula

Corso Progettazione database

11 Maggio 2012 a Milano
Disponibilità: 6 Posti

Amministratore di Reti Windows Server 2008

11 Giugno 2012 a Milano
Disponibilità: 5 Posti

Nessun corso previsto