Jako przykład podajemy następujące zapytanie LINQ. Proszę nie komentować samego kodu, ponieważ właśnie go wpisałem, aby pomóc w rozwiązaniu tego problemu.Duże zapytanie grupowania LINQ, co się dzieje za kulisami
Następujące zapytanie LINQ używa "grupy według" i oblicza informacje podsumowujące. Jak widać, istnieje wiele obliczeń, które są wykonywane na danych, ale jak skuteczne jest LINQ za kulisami.
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();
- Ile razy jest lista „Ninjas” jest powtórzyć w ciągu w celu obliczenia każdej wartości?
- Czy szybsze byłoby użycie pętli foreach, aby przyspieszyć wykonanie takiego zapytania?
- Dodanie ".AsParallel()" po Ninjas spowoduje poprawę wydajności?
- Czy istnieje lepszy sposób obliczania letniej informacji dla listy?
Każda rada jest doceniana, ponieważ używamy tego rodzaju kodu w całym naszym oprogramowaniu i naprawdę chciałbym lepiej zrozumieć, co LINQ robi pod maską (że tak powiem). Być może istnieje lepszy sposób?
+1 dla ninja. –
Ważne jest, aby wiedzieć, czy 'Ninjas' jest' IEnumerable' lub 'IQueryable'. Jeśli były, zostanie wyliczony dokładnie jeden raz. Jeśli to ostatnie, nie ma wyliczenia, o którym można by mówić; zapytanie jest kompilowane bezpośrednio do, na przykład, SQL; grupowanie jest wykonywane przez DBMS, a jedyną rzeczą wymienioną w C# jest zestaw wyników. –
"Ninjas" jest na liście pamięci, IEnumerable. – Belinda