LINQ - Написание метода расширения для получения строки с максимальным значением для каждой группы

Моему приложению часто требуется сгруппировать таблицу, а затем вернуть строку с максимальным значением для этой группы. Это довольно легко сделать в 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, и вы не можете даже передать его Максу. Я попытался переписать, сделав 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, что, кажется, имеет значение.

5
задан StriplingWarrior 18 August 2011 в 22:58
поделиться