Enumerable.GroupBy
和Queryable.GroupBy
扩展有8个重载。它们(Enumerable.GroupBy
)中有两个是:GroupBy with elementSelector and 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);
(用于Queryable.GroupBy
相同,只是Expression<Func<...
代替Func<...
)
(b)
有一个附加elementSelector
作为参数。
在MSDN上是an example for overload (a)和an example for overload (b)。他们用同样的例子源集合两者的工作:
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 }
};
示例(a)使用该查询:
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)
});
而且例(b)使用该查询:
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()
});
结果这两个查询是完全一样的。
问题1:单独使用resultSelector
而我真的需要elementSelector
我无法表达任何种类的查询吗?或者这两种重载的能力总是相等的,而用这种或那种方式只是一种品味问题?
问题2:在使用LINQ查询语法时是否存在两种不同重载的对应项?
(作为一个方面的问题:当使用Queryable.GroupBy
实体框架,都将过载被翻译成完全相同的SQL?)