【发布时间】:2011-09-14 05:20:11
【问题描述】:
我的应用程序经常需要对表进行分组,然后返回该组的最大值所在的行。这在 LINQ 中很容易做到:
myTable.GroupBy(r => r.FieldToGroupBy)
.Select(r => r.Max(s => s.FieldToMaximize))
.Join(
myTable,
r => r,
r => r.FieldToMaximize,
(o, i) => i)
现在假设我想将其抽象为它自己的方法。我试着写这个:
public static IQueryable<TSource>
SelectMax<TSource, TGroupKey, TMaxKey>(
this IQueryable<TSource> source,
Expression<Func<TSource, TGroupKey>> groupKeySelector,
Expression<Func<TSource, TMaxKey>> maxKeySelector)
where TMaxKey : IComparable
{
return source
.GroupBy(groupKeySelector)
.Join(
source,
g => g.Max(maxKeySelector),
r => maxKeySelector(r),
(o, i) => i);
}
不幸的是,这不会编译:maxKeySelector 是一个表达式(所以你不能在 r 上调用它,你甚至不能将它传递给 Max。所以我尝试重写,使 maxKeySelector 成为一个函数而不是一个表达式:
public static IQueryable<TSource>
SelectMax<TSource, TGroupKey, TMaxKey>(
this IQueryable<TSource> source,
Expression<Func<TSource, TGroupKey>> groupKeySelector,
Func<TSource, TMaxKey> maxKeySelector)
where TMaxKey : IComparable
{
return source
.GroupBy(groupKeySelector)
.Join(
source,
g => g.Max(maxKeySelector),
r => maxKeySelector(r),
(o, i) => i);
}
现在编译。但它在运行时失败:“用于查询运算符'Max'的不支持的重载。”这就是我所坚持的:我需要找到将 maxKeySelector 传递给 Max() 的正确方法。
有什么建议吗?我正在使用 LINQ to SQL,这似乎有所作为。
【问题讨论】:
标签: c# linq linq-to-sql