Rozszerzenia Enumerable.GroupBy
i Queryable.GroupBy
mają 8 przeciążeń. Dwa z nich (na Enumerable.GroupBy
) są:GroupBy z elementemSelector i resultSelector
// (a)
IEnumerable<TResult> GroupBy<TSource, TKey, TResult>(
this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector,
Func<TKey, IEnumerable<TSource>, TResult> resultSelector);
// (b)
IEnumerable<TResult> GroupBy<TSource, TKey, TElement, TResult>(
this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector,
Func<TSource, TElement> elementSelector,
Func<TKey, IEnumerable<TElement>, TResult> resultSelector);
(dla Queryable.GroupBy
taka sama, tylko z Expression<Func<...
zamiast Func<...
)
(b)
posiada dodatkową elementSelector
jako parametr.
Na stronie MSDN to an example for overload (a) i an example for overload (b). Obie prace w tej samej kolekcji przykład źródło:
List<Pet> petsList = new List<Pet>
{
new Pet { Name="Barley", Age=8.3 },
new Pet { Name="Boots", Age=4.9 },
new Pet { Name="Whiskers", Age=1.5 },
new Pet { Name="Daisy", Age=4.3 }
};
przykład (a) używa tego zapytania:
var query = petsList.GroupBy(
pet => Math.Floor(pet.Age), // keySelector
(age, pets) => new // resultSelector
{
Key = age,
Count = pets.Count(),
Min = pets.Min(pet => pet.Age),
Max = pets.Max(pet => pet.Age)
});
i przykładem (b) zastosowania tego zapytania:
var query = petsList.GroupBy(
pet => Math.Floor(pet.Age), // keySelector
pet => pet.Age, // elementSelector
(baseAge, ages) => new // resultSelector
{
Key = baseAge,
Count = ages.Count(),
Min = ages.Min(),
Max = ages.Max()
});
Wynik obu zapytań jest dokładnie taki sam.
Pytanie 1: Czy istnieje zapytanie, którego nie mogę wyrazić przy użyciu samego resultSelector
i gdzie naprawdę potrzebowałbym elementSelector
? Czy możliwości dwóch przeciążeń są zawsze ekwiwalentne i jest to tylko kwestia gustu, aby skorzystać z jednego lub drugiego sposobu?
Pytanie 2: Czy istnieje odpowiednik dwóch różnych przeciążeń przy użyciu składni zapytania LINQ?
(jako pytanie niepożądane: Przy stosowaniu Queryable.GroupBy
z Entity Framework, będą oba przeciążenia zostać przetłumaczony na dokładnie tym samym SQL?)