Le novità di C# 3.0 e Visual Basic 9.0 attraverso LINQ

5 pagine in totale: <<Indietro 1 2 3 [4] 5 Avanti >>

LINQ To XML e Query Expression

Gli esempi visti fino ad adesso hanno avuto a che fare con liste di oggetti già caricate in memoria, ma LINQ è in grado di interrogare anche sorgenti XML. Non solo, LINQ To XML permette anche di creare file e stringhe XML. Se, ad esempio, si volesse trasformare la lista di persone in xml si dovrebbe scrivere:

//C#
var query = new XDocument(
  new XElement("persone",
  from p in persone
  select new XElement("persona",
    new XElement("nome", p.Nome),
    new XElement("cognome", p.Cognome),
    new XElement("eta", p.Eta)
    )
  )
);

'VB
Dim query = New XDocument( _
  New XElement("persone", _
    From p In persone _
    Select New XElement("persona", _
      New XElement("nome", p.Nome), _
      New XElement("cognome", p.Cognome), _
      New XElement("eta", p.Eta) _
    ) _
  ) _
)

Utilizzando il metodo Save della classe XDocument, si può anche salvare la stringa xml su File System.

Ora che abbiamo a disposizione il file su disco, lo si può interrogare per ottenere una lista di persone con più di 30 anni.

//C#
var result = from p in XElement.Load("Persone.xml").Elements("Persona")
  where (int)p.Element("Eta") > 30
  select new Persona {
    Nome = (string)p.Element("Nome"),
    Cognome = (string)p.Element("Cognome"),
    Eta = (int)p.Element("Eta")
  };

'VB
Dim result = From p In XElement.Load("Persone.xml").Elements("Persona") _
  Where CType(p.Element("Eta").Value, Int32) > 30 _
  Select New Persona With { _
  .Nome = p.Element("Nome").Value, _
  .Cognome = p.Element("Cognome").Value, _
  .Eta = CType(p.Element("Eta").Value, Int32) _
}

Come si vede dall'esempio, si sono presi tutti i nodi Persona del file e si sono presi quelli con il sottoelemento età maggiore di 30.

Questa query introduce una grande novità dei linguaggi: la Query Expression (from, select, where). La Query Expression non è altro che un modo più pratico, rispetto alle Lambda Expression, di scrivere query LINQ al fine di ottenere una sintassi simile al linguaggio SQL. Questa caratteristica è comunemente definita Sintactic Sugar poiché, in fase di compilazione, la query viene trasformata in Extension Methods e Lambda Expression. Questo significa che si possono scrivere query in entrambi i modi senza incorrere in alcun problema di performance. E' da tenere bene in mente che la Query Expression non copre tutte le necessità di interrogazione, quindi in alcuni casi il ricorso all'accoppiata Extension+Lambda è inevitabile.

Una grossa differenza tra la Query Expression e la sintassi SQL è che la prima parte direttamente dalla clausola from, mentre la seconda parte dalla select. Quando è stata introdotta questa feature, si è provato ad imitare al 100% la sintassi SQL, ma c'erano ovvi problemi di autocompletion: fornire l'autocompletion nella select per dichiarare i dati da estrarre ancor prima di dire da dove estrarli è impossibile. Questo è un problema che hanno tutti i prodotti che offrono l'autocompletion per SQL.

Un punto dove VB è decisamente più potente di C#, è LINQ To XML. Infatti con VB la dichiarazione di strutture XML è molto meno verbosa e più intuitiva. Questo argomento merita di essere trattato in un articolo a parte che verrà pubblicato in futuro su questo sito.

5 pagine in totale: <<Indietro 1 2 3 [4] 5 Avanti >>

Contenuti dell'articolo

Commenti
Dai un voto a questo articolo, ci aiuterà a migliorare il nostro sito (1 è il voto minimo, 5 il massimo).

Per procedere al rating dell'articolo devi essere autenticato.
dops scrive:
Le novità di C# 3.0 e Visual Basic 9.0 attraverso LINQ

Pagina 2, paragrafo "Object Initializer":"Se la classe non mette a disposizione un parametro senza costruttori.."forse si intendeva un "..costruttore ...
domenica 4 maggio 2008 | 1 risposta

Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.



TUTORIALS


IN EVIDENZA
MISC