Procedura: eseguire una sottoquery su un'operazione di raggruppamento (Guida per programmatori C#)
In questo argomento sono illustrati due modi diversi per creare una query che ordina i dati di origine in gruppi e quindi esegue una sottoquery su ogni singolo gruppo. La tecnica di base in ogni esempio consiste nel raggruppare gli elementi di origine utilizzando una continuazione denominata newGroup e generando quindi una nuova sottoquery a fronte di newGroup. Questa sottoquery viene eseguita a fronte di ogni nuovo gruppo creato dalla query esterna. Si noti che in questo particolare esempio l'output finale non è un gruppo, ma una sequenza semplice di tipi anonimi.
Per ulteriori informazioni su come eseguire il raggruppamento, vedere Clausola group (Riferimento C#).
Per ulteriori informazioni sulle continuazioni, vedere into (Riferimenti per C#). Nell'esempio seguente viene utilizzata una struttura di dati in memoria come origine dati, ma gli stessi principi sono validi per qualsiasi tipo di origine dati di LINQ.
Esempio
public void QueryMax()
{
var queryGroupMax =
from student in students
group student by student.Year into studentGroup
select new
{
Level = studentGroup.Key,
HighestScore =
(from student2 in studentGroup
select student2.ExamScores.Average()).Max()
};
int count = queryGroupMax.Count();
Console.WriteLine("Number of groups = {0}", count);
foreach (var item in queryGroupMax)
{
Console.WriteLine(" {0} Highest Score={1}", item.Level, item.HighestScore);
}
}
Compilazione del codice
In questo esempio sono contenuti i riferimenti a oggetti definiti nell'applicazione di esempio in Procedura: eseguire una query su un insieme di oggetti (Guida per programmatori C#). Per compilare ed eseguire questo metodo, incollarlo nella classe StudentClass in tale applicazione e aggiungervi una chiamata dal metodo Main.
Quando si adatta questo metodo alla propria applicazione, ricordare che LINQ richiede la versione 3.5 di .NET Framework e che il progetto deve contenere un riferimento a System.Core.dll e una direttiva using per System.Linq. I tipi LINQ to SQL, LINQ to XML e LINQ to DataSet richiedono direttive using e riferimenti aggiuntivi. Per ulteriori informazioni, vedere la classe Procedura: creare un progetto LINQ.