Parliamo di LINQ ...

Dopo il rilascio della beta 2 di Visual Studio 2008, penso sia giunta l'ora di cominciare a parlare di LINQ anche nel mio blog  e quindi inauguro una nuova categoria.

LINQ (language integrated query) rappresenta una delle novità più importanti introdotte con il .NET Framework 3.5. In poche parole rappresenta un nuovo modello di programmazione con cui possiamo usare una sintassi "alla SQL", per intenderci, direttamente da C# o da VB.NET. Questa nuova sintassi non si applica solo per interrogazioni eseguite su database relazionali, ma anche alle collezioni di oggetti e all' XML.

Pensando a VS 2008 è interessante approfondire almeno le seguenti implementazioni di questo modello di programmazione:

  • LINQ to Objects
  • LINQ to XML
  • LINQ to SQL
  • LINQ to DataSet

LINQ si basa su delle estensioni al linguaggio che rendono possibile implementare lo stesso approccio di programmazione anche verso altre sorgenti dati.

Vediamo qualche semplice esempio con VS 2008 per capire meglio, partiamo da LINQ to Objects, nei prossimi post mi occuperò delle altre implementazioni. LINQ to SQL ed il supporto offerto da VS 2008 in particolare è sicuramente una degli aspetti più intersessanti e di maggior utilità in molte applicazioni.

LINQ to Objects

Creiamo una semplice console application in C# 3.0. Notiamo come prima cosa la presenza di un nuovo namespace System.Linq. Creiamo una semplice array di stringe e poi usiamo LINQ per effettuare un'operazione di filtraggio

linq1

Da queste poche righe notiamo alcune cose importanti: abbiamo utilizzato LINQ per filtrare un array di stringhe, nell'esempio è molto chiaro cosa vogliamo ottenere e la sintassi che usiamo assomiglia molto a quella che avremmo usato per fare una query su un database. Nel codice f è una stringa e anche l'IDE di VS lo riconosce come tale.

linq5

Notate che f ha il metodo StartWith, normalmente presente per le stringhe e nella figura anch VS la riconosce con l'IntelliSense.

Una nuova keyword "var" appare nel codice in C#. Grazie all'uso di var il compilatore stabilisce il tipo della variabile a partire dalla sua dichiarazione. Quindi la variabile nell'esempio è una stringa. Allo stesso modo scrivendo "var i = 1; var b = true;" il compilatore è in grado di inferire che la variabile i è un intero e che b è di tipo boolean.

L'output del nostro programma è quello che ci aspettiamo la variabile fruttiPreferiti contiene le due stringhe che iniziano con la lettera "m", cioè mela e mandarino.

Avremmo potuto utilizzare non solo stringhe ma anche dei tipi custom, come ad esempio una lista di clienti e effetuare altre operazioni utilizzando altri operatori standard di LINQ, si veda ad esempio il seguente codice:

linq4

Nell'esempio di codice sopra riportato si vuole ottenenere la lista dei clienti odinati in modo discendente di sola nazionalità italiana.

Notiamo alcune cose interessanti: nella classe cliente le proprietà sono dichiarate con una sintassi semplificata. Anche questa è una delle novità introdotta dal C# 3.0. Comoda vero?

Nella creazione della lista clienti i nuovi clienti sono creati e allo stesso tempo sono inizializzate le proprietà Nome e Nazione. Questo nuovo costrutto del linguaggio viene chiamato Object Initializer. Notate che la classe Cliente, non ha costruttori a cui passare i due parametri per inizializzare le proprietà. 

Infine ho utilizzato due nuovi operatori orderby e descending, il cui significato mi sembra scontato.  Alla fine ecco l'output della nostra applicazione:

image

 Usiamo VB.NET

Fino ad ora abbiamo scritto il codice utilizzando C# ed in particolare il C# 3.0 con alcune delle nuove estensioni al linguaggio, come la keywork var, la generazione automatica delle proprietà e l'Object Initializer. Tuttavia anche VB.NET mette a disposizione le stesse estensione e altre nel nuovo VB.NET 9.0.

Ecco un esempio:

image

Da notare:

La classe Person non ha costruttori. Abbiamo creato una lista di people ed abbiamo usato anche in questo caso l'Object Initializer per creare istanze delle classe e inizializzare le relative proprietà, notate l'uso delle parentesi graffe.

Anche in questo caso il compilatore è in grado di inferire il tipo diteeagers e di teen usato nel ciclo For Each.

Ecco infinre l'output:

image

Da dove partire ...

Spero di avere stimolato la curiosità di chi si avvicina per la prima volta a LINQ. Per chi vuole cominciare a fare qualche prova consiglio questo percorso:

  1. Scaricare la beta 2 di Visual Studio 2008
  2. Laboratori di Linq in C#
  3. Laboratori di Linq in VB.NET

 

Qualche link utile

The LINQ Project

Esempi VS08 Beta 2, anche HOL (laboratori) su LINQ

C# 3.0 Language Specification

 

Interessante vero? Ai prossimi post su LINQ.

-Pietro