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.