Prendere come esempio la seguente query LINQ. Si prega di non commentare il codice stesso come ho appena digitato per aiutare con questa domanda.Query di raggruppamento LINQ di grandi dimensioni, cosa accade dietro le quinte
La seguente query LINQ utilizza un "gruppo per" e calcola le informazioni di riepilogo. Come puoi vedere ci sono numerosi calcoli che vengono eseguiti sui dati ma quanto è efficiente LINQ dietro le quinte.
var NinjasGrouped = (from ninja in Ninjas
group pos by new { pos.NinjaClan, pos.NinjaRank }
into con
select new NinjaGroupSummary
{
NinjaClan = con.Key.NinjaClan,
NinjaRank = con.Key.NinjaRank,
NumberOfShoes = con.Sum(x => x.Shoes),
MaxNinjaAge = con.Max(x => x.NinjaAge),
MinNinjaAge = con.Min(x => x.NinjaAge),
ComplicatedCalculation = con.Sum(x => x.NinjaGrade) != 0
? con.Sum(x => x.NinjaRedBloodCellCount)/con.Sum(x => x.NinjaDoctorVisits)
: 0,
ListOfNinjas = con.ToList()
}).ToList();
- Quante volte è l'elenco dei 'Ninjas' essere iterato sopra al fine di calcolare ciascuno dei valori?
- Sarebbe più rapido impiegare un ciclo foreach per accelerare l'esecuzione di tale query?
- Aggiungendo ".AsParallel()" dopo Ninjas si ottengono miglioramenti delle prestazioni?
- Esiste un modo migliore per calcolare le informazioni di scadenza per l'elenco?
Qualsiasi consiglio è apprezzato poiché utilizziamo questo tipo di codice in tutto il nostro software e mi piacerebbe davvero ottenere una migliore comprensione di ciò che LINQ sta facendo sotto il cofano (per così dire). Forse c'è un modo migliore?
+1 per i ninja. –
È importante sapere se 'Ninjas' è un' IEnumerable' o un 'IQueryable'. Se precedente, verrebbe enumerato esattamente una volta. In quest'ultimo caso, non c'è nessuna enumerazione di cui parlare; la query è compilata, ad esempio, direttamente in SQL; il raggruppamento è fatto dal DBMS e l'unica cosa enumerata in C# è il set di risultati. –
'Ninjas' è un elenco in memoria, IEnumerable. – Belinda