In un precedente post abbiamo visto come eseguire una semplicissima query LINQ su una collection di oggetti per estrarre solo i dati di nostro interesse. Riprendiamo quel post e il relativo codice per vedere due nuovi concetti: l'ordinamento tramite la clausola Order By e l'uso di un tipo anonimo.
Supponiamo di avere una classe Impiegato, con due proprietà Nome e Ruolo:
Class Impiegato
Private name As String
Private role As String
Property Nome() As String
Get
Return name
End Get
Set(ByVal value As String)
name = value
End Set
End Property
Property Ruolo() As String
Get
Return role
End Get
Set(ByVal value As String)
role = value
End Set
End Property
End Class
Istanziamo una collection generica di oggetti di tipo Impiegato e la popoliamo con qualche personaggio:
Dim impiegati As New List(Of Impiegato)
impiegati.Add(New Impiegato With {.Nome = "Alessandro", .Ruolo = "Amministrativo"})
impiegati.Add(New Impiegato With {.Nome = "Mario", .Ruolo = "Commerciale"})
impiegati.Add(New Impiegato With {.Nome = "Sergio", .Ruolo = "Amministrativo"})
Ipotizziamo, ora, di voler estrarre dalla collection il solo nome degli impiegati appartenenti al ruolo "Amministrativo", ordinando il risultato in modo discendente. Una query LINQ possibile è la seguente:
Dim amministrativi = From amministrativo In impiegati _
Where (amministrativo.Ruolo = "Amministrativo") _
Order By amministrativo.Nome Descending _
Select amministrativo.Nome
La collection ottenuta può poi essere iterata come segue, per visualizzare solo i due nomi appartenenti al ruolo indicato (quindi, nell'esempio, Sergio e Alessandro) il cui ordinamento è alfabetico ma inverso:
For Each persona In amministrativi
Console.WriteLine(persona)
Next
Console.ReadLine()
L'obiettivo è stato raggiunto tramite l'utilizzo della clausola Order By (che appunto permette di ordinare il risultato). Questa clausola consente di specificare le modalità di ordinamento, ascendente (keyword Ascending) o discendente (keyword Descending).
Il seguente snippet, invece, mostra il raggiungimento dello stesso risultato ma con l'utilizzo di un tipo anonimo nella clausola Select:
Dim amministrativi = From amministrativo In impiegati _
Where (amministrativo.Ruolo = "Amministrativo") _
Order By amministrativo.Nome Descending _
Select New With {.Nome = amministrativo.Nome}
A questo punto, la variabile Amministrativi diventa una collection di tipi anonimi che può essere iterata normalmente, nella maniera seguente:
For Each persona In amministrativi
Console.WriteLine(persona.Nome)
Next
Console.ReadLine()
Alessandro