di: Giuseppe Marchi 20 Febbraio 2008
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.
Guida Windows Azure Code SnippetsLe migliori pratiche per far girare le applicazioni "in the cloud",... |
Guida ASP.NET MVC Best PracticesUn workflow dettagliato e ricco di suggerimenti pratici per... |
Guida ASP.NET Starter KitUn modo semplice per imparare ad utilizzare le tecnologie Microsoft... |
Ogni giovedì, direttamente nella tua e-mail: articoli, guide, tutorial e script ASP, ASP.Net, SQL server e IIS.
Iscriviti alla newsletter
|
|
Corso Progettazione database11 Maggio 2012 a Milano |
|
|
Amministratore di Reti Windows Server 200811 Giugno 2012 a Milano |
|
Nessun corso previsto |