Моему приложению часто нужно сгруппировать таблицу, а затем вернуть строку с максимальным значением для этой группы. Это довольно легко сделать в 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);
}
Теперь это компилируется. Но происходит сбой во время выполнения: «Неподдерживаемая перегрузка используется для оператора запроса« Макс »». Это то, на чем я застрял: мне нужно найти правильный способ передачи maxKeySelector в Max ().
Есть предложения? Я использую LINQ to SQL, что, кажется, имеет значение.