Relazioni tra i tipi nelle operazioni di query (LINQ)
Aggiornamento: novembre 2007
Per scrivere le query in modo corretto, è necessario comprendere il modo in cui i tipi delle variabili in un'operazione di query interagiscono tra loro. Se si comprendono queste relazioni si comprenderanno più facilmente gli esempi LINQ e gli esempi di codice presenti nella documentazione. Si comprenderanno inoltre le operazioni eseguite automaticamente quando le variabili vengono tipizzate in modo implicito utilizzando var.
Le operazioni di query LINQ sono fortemente tipizzate nell'origine dati, nella query stessa e nell'esecuzione della query. Il tipo delle variabili nella query deve essere compatibile con il tipo degli elementi nell'origine dati e con il tipo della variabile di iterazione nell'istruzione foreach. Questa tipizzazione forte consente di rilevare gli errori di tipo in fase di compilazione quando possono essere corretti prima che vengano riscontrati dagli utenti.
Per illustrare queste relazioni tra i tipi, nella maggior parte degli esempi riportati di seguito viene utilizzata la tipizzazione esplicita per tutte le variabili. Nell'ultimo esempio viene illustrato come valgono gli stessi principi anche quando viene utilizzata la tipizzazione implicita mediante var.
Query che non trasformano i dati di origine
Nella figura seguente viene illustrata un'operazione di query LINQ to Objects che non esegue alcuna trasformazione sui dati. L'origine contiene una sequenza di stringhe e anche l'output della query è una sequenza di stringhe.
L'argomento di tipo dell'origine dati determina il tipo della variabile di intervallo.
Il tipo dell'oggetto selezionato determina il tipo della variabile di query. In questo caso name è una stringa. Pertanto, la variabile di query è IEnumerable<stringa>.
La variabile di query viene scorsa nell'istruzione foreach. Poiché la variabile di query è una sequenza di stringhe, anche la variabile di iterazione è una stringa.
Query che trasformano i dati di origine
Nella figura seguente viene illustrata un'operazione di query LINQ to SQL che esegue una trasformazione semplice sui dati. La query utilizza una sequenza di oggetti Customer come input e seleziona solo la proprietà Name nel risultato. Poiché Name è una stringa, la query genera una sequenza di stringhe come output.
L'argomento del tipo dell'origine dati determina il tipo della variabile di intervallo.
L'istruzione select restituisce la proprietà Name invece dell'intero oggetto Customer. Poiché Name è una stringa, l'argomento del tipo di custNameQuery è string, non Customer.
Poiché custNameQuery è una sequenza di stringhe, anche la variabile di iterazione del ciclo foreach deve essere string.
Nella figura seguente viene illustrata una trasformazione leggermente più complessa. L'istruzione select restituisce un tipo anonimo che acquisisce solo due membri dell'oggetto Customer originale.
L'argomento del tipo dell'origine dati è sempre il tipo della variabile di intervallo nella query.
Poiché l'istruzione select genera un tipo anonimo, la variabile di query deve essere tipizzata in modo implicito utilizzando var.
Poiché il tipo della variabile di query è implicito, anche la variabile di iterazione nel ciclo foreach deve essere implicita.
Deduzione delle informazioni sul tipo tramite il compilatore
Sebbene sia necessario comprendere le relazioni tra i tipi in un'operazione di query, è possibile consentire al compilatore di svolgere tutte le operazioni autonomamente. La parola chiave var può essere utilizzata per qualsiasi variabile locale in un'operazione di query. La figura seguente è esattamente equivalente a quella riportata nel secondo esempio illustrato precedentemente. L'unica differenza consiste nel fatto che il compilatore fornirà il tipo forte per ogni variabile nell'operazione di query:
Per ulteriori informazioni su var, vedere Variabili locali tipizzate in modo implicito (Guida per programmatori C#).