domenica 15 gennaio 2012

Introduzione a Linq VB.Net e C#

Riporto l'articolo scritto per il sito http://www.iprogrammatori.it/articoli/programmazione/art_introduzione-a-linq-vbnet-e-c_1127.aspx





Introduzione
In questo articolo vedremo le basi della tecnologia Linq, per i linguaggi VB.Net e C#, tutti gli esempi si possono utilizzare con la versione 4 del framework.



Stesura di codice
Qui di seguito si riportano i vari esempi di LINQ, il più comune è la select, ossia l’estrapolazione dei dati.
Prima di utlizzare le varie funzioni, si devono creare due classi, su cui poter effettuare dei test.
Qui di seguito si riportano le classi di nome Editore e Libri.



VB.Net



Public Class Libro



Public ID As Integer



Public titolo As String



End Class







Public Class Editore



Property id As Integer



Property Categoria As String



End Class





C#



public class Libro



{





public int ID { get; set; }



public string titolo { get; set; }





}







public class Editore



{



public int id { get; set; }





public string Categoria { get; set; }



}





Dopo aver creato le classi, bisogna creare le funzioni per il caricamento dei dati, ossia due funzioni, che restituiscono una lista di oggetti, in modo che possiamo effettuare le query tramite linq.







VB.Net



Private Function CaricaEditore() As List(Of Editore)



Dim editor As New Editore()



Dim listEditore As New List(Of Editore)



editor.id = 1



editor.Categoria = "Romantici"



listEditore.Add(editor)



editor = New Editore()



editor.id = 2



editor.Categoria = "Avventura"



listEditore.Add(editor)



editor = New Editore()



Return listEditore



End Function





Private Function CaricaLibri() As List(Of Libro)



Dim libro As New Libro()



Dim listLibro As New List(Of Libro)



libro.ID = 1



libro.titolo = "Il principe"



listLibro.Add(libro)



libro = New Libro()



libro.ID = 2



libro.titolo = "Il vento"



listLibro.Add(libro)



libro = New Libro()



libro.ID = 1



libro.titolo = "Il re"



listLibro.Add(libro)



Return listLibro



End Function







C#



private List<Editore> CaricaEditore()



{



Editore editor = new Editore();



List<Editore> listEditore = new List<Editore>();



editor.id = 1;



editor.Categoria = "Romantici";



listEditore.Add(editor);



editor = new Editore();



editor.id = 2;



editor.Categoria = "Avventura";



listEditore.Add(editor);



return listEditore;



}





private List<Libro> CaricaLibri()



{



Libro libro = new Libro();



List<Libro> listLibro = new List<Libro>();



libro.ID = 1;



libro.titolo = "Il principe";



listLibro.Add(libro);



libro = new Libro();



libro.ID = 2;



libro.titolo = "Il vento";



listLibro.Add(libro);



libro = new Libro();



libro.ID = 1;



libro.titolo = "Il re";



listLibro.Add(libro);



return listLibro;





}





Terminata la parte riguardante i dati, per la relativa manipolazione, vediamo come estrapolare i dati.
Tramite la select, visualizziamo a video tutti i dati.



Qui di seguito si riporta un esempio di Select per il linguaggio VB.Net e C#




VB.Net



Private Sub BtnSelect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSelect.Click





Dim listEditore = CaricaEditore()



Dim editori = From elemento In listEditore



Select elemento





For Each elemento In editori



MessageBox.Show("Categoria: " & elemento.Categoria)





Next



End Sub





C#



private void BtnSelect_Click(object sender, EventArgs e)



{





var listEditore = CaricaEditore();





var editori = from elemento in listEditore



select elemento;



foreach (var elemento in editori)



{



MessageBox.Show("Categoria: " + elemento.Categoria);



}



}







Se invece vogliamo estrapolare i dati utilizzando un certo criterio, come nelle istruzioni Sql, dobbiamo utilizzare la parola chiave “Where”, qui di seguito si riporta un esempio.




VB.Net



Private Sub BtnWhere_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnWhere.Click



Dim listEditore = CaricaEditore()



Dim editori = From elemento In listEditore



Where elemento.id = 1



Select elemento





For Each elemento In editori



MessageBox.Show("Categoria: " & elemento.Categoria)



Next



End Sub





C#



private void BtnWhere_Click(object sender, EventArgs e)



{



var listEditore = CaricaEditore();





var editori = from elemento in listEditore



where elemento.id == 1



select elemento;



foreach (var elemento in editori)



{



MessageBox.Show("Categoria: " + elemento.Categoria);



}



}



Mentre se vogliamo raggruppare i dati in base ad un determinato campo, come potrebbe avvenire in Sql, anche qui possiamo utilizzare la parola chiave “Group”.



Si riporta un esempio di codice in cui si crea un alias di nome count, in cui si trova il totale dei singoli raggrupamenti, qui un esempio per entrambi i linguaggi.



VB.Net



Private Sub BtnGrouping_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnGrouping.Click



Dim listLibri = CaricaLibri()



Dim risulLibri = From elementi In listLibri



Group By elementi.ID Into gruppi = Group, Count()





For Each elemento In risulLibri





MessageBox.Show("Codice: " & elemento.ID.ToString() + " Count: " & elemento.Count.ToString())





Next





End Sub





C#



private void BtnGrouping_Click(object sender, EventArgs e)



{





var listLibri = CaricaLibri();



var risulLibri = from elementi in listLibri



group elementi by elementi.ID into gruppi



select new { CodiceID = gruppi.Key, count = gruppi.Count() };







foreach (var elemento in risulLibri)



{



MessageBox.Show("Codice: " + elemento.CodiceID + " Count: " + elemento.count);



}





}





Mentre se vogliamo ottenere il dato che ha il valore maggiore, utilizziamo la parola chiave “Max”
Qui di seguito si riporta un esempio per entrambi i linguaggi.




VB.Net



Private Sub BtnMax_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnMax.Click



Dim listLibri = CaricaLibri()



Dim risulLibri = From elementi In listLibri



Select elementi



MessageBox.Show("MAX: " + risulLibri.Max(Function(m) m.ID).ToString())





End Sub





C#



private void BtnMax_Click(object sender, EventArgs e)



{



var listLibri = CaricaLibri();



var risulLibri = from elementi in listLibri





select elementi;



MessageBox.Show("MAX: " + risulLibri.Max(m => m.ID).ToString());





}



Mentre se vogliamo ottenere il dato che ha il valore minore, utilizziamo la parola chiave “Min”
Qui di seguito si riporta il codice per entrambi i linguaggi.



VB.Net



Private Sub BtnMin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnMin.Click



Dim listLibri = CaricaLibri()



Dim risulLibri = From elementi In listLibri



Select elementi



MessageBox.Show("MIN: " + risulLibri.Min(Function(m) m.ID).ToString())



End Sub





C#



private void BtnMin_Click(object sender, EventArgs e)



{



var listLibri = CaricaLibri();



var risulLibri = from elementi in listLibri





select elementi;



MessageBox.Show("MIN: " + risulLibri.Min(m => m.ID).ToString());



}



Per ottenere la media dei valori, possiamo utilizzare la parola chiave “Average” che ci fornisce il valore medio di tutti dati in riferimento ad un campo.
Qui si riporta un esempio di codice.



VB.Net



Private Sub BtnMedia_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnMedia.Click



Dim listLibri = CaricaLibri()



Dim risulLibri = From elementi In listLibri



Select elementi



MessageBox.Show("MEDIA: " + risulLibri.Average(Function(m) m.ID).ToString())



End Sub





C#



private void BtnMedia_Click(object sender, EventArgs e)



{



var listLibri = CaricaLibri();



var risulLibri = from elementi in listLibri





select elementi;



MessageBox.Show("MEDIA: " + risulLibri.Average(m => m.ID).ToString());



}





Se invece, vogliamo effettuare una query di relazione, come spesso utilizziamo per una base dati, tramite la parola chiave “Join” possiamo “legare” due oggetti ed estrapolare i dati con i campi di entrambi.
Qui di seguito si riporta un esempio di codice per entrambi i linguaggi.




VB.Net



Private Sub BtnJoin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnJoin.Click



Dim editori = CaricaEditore()



Dim libri = CaricaLibri()



Dim dati = From elementoLibri In libri



Join elementoEditori In editori On elementoLibri.ID Equals elementoEditori.id



Select New With {elementoLibri.titolo, elementoEditori.Categoria}



For Each elemento In dati



MessageBox.Show("Titolo: " + elemento.titolo + " Categoria: " + elemento.Categoria)



Next



End Sub





C#



private void BtnJoin_Click(object sender, EventArgs e)



{



var editori = CaricaEditore();



var libri = CaricaLibri();



var dati = from elementoLibri in libri



join elementoEditori in editori on elementoLibri.ID equals elementoEditori.id



select new {elementoLibri.titolo, elementoEditori.Categoria};







foreach (var elemento in dati)



{



MessageBox.Show("Titolo: " + elemento.titolo +" Categoria: " + elemento.Categoria);



}





}





Infine l’ultimo esempio di questa introduzione, riguarda la paginazione, come estrapolare determinati dati e renderli impaginati, il tutto si ottiene prendendo un limitato numero (tramite il metodo “take”) evitando quelli precedenti (tramite il metodo “skip”)
Qui di seguito si riporta un esempio di codice




VB.Net



Private Sub BtnPaging_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnPaging.Click



Dim editori = CaricaEditore()



Dim libri = CaricaLibri()



Dim dati = (From elementoLibri In libri



Join elementoEditori In editori On elementoLibri.ID Equals elementoEditori.id



Select New With {elementoLibri.titolo, elementoEditori.Categoria}).Skip(1).Take(1)



For Each elemento In dati



MessageBox.Show("Titolo: " + elemento.titolo + " Categoria: " + elemento.Categoria)



Next



End Sub





C#



private void BtnPaging_Click(object sender, EventArgs e)



{



var editori = CaricaEditore();



var libri = CaricaLibri();



var dati = (from elementoLibri in libri



join elementoEditori in editori on elementoLibri.ID equals elementoEditori.id



select new { elementoLibri.titolo, elementoEditori.Categoria }).Skip(1).Take(1);







foreach (var elemento in dati)



{



MessageBox.Show("Titolo: " + elemento.titolo + " Categoria: " + elemento.Categoria);



}



}







Conclusioni
L’articolo ha voluto fornire al lettore le basi di questa tecnologia, rilasciata dalla versione 3.5 del Framework.
Le potenzialità offerte, sono moltissime, e illustrarle tutte richiederebbe un libro o una lunga serie di articoli.
Ricordiamo che gli esempi utilizzati in questo caso, si possono utilizzare anche con una fonte dati, infatti linq, si può utilizzare con un database Sql server (linq to sql) o file xml (linq to xml) o altro.
Uno strumento in più che permette al programmatore di disporre di soluzioni potenti e flessibili.

Nessun commento: