Moja aplikacja często musi zgrupować tabelę, a następnie zwrócić wiersz z maksymalną wartością dla tej grupy. Jest to łatwe do wykonania w LINQ:LINQ - Zapisywanie metody rozszerzenia w celu uzyskania wiersza z maksymalną wartością dla każdej grupy
myTable.GroupBy(r => r.FieldToGroupBy)
.Select(r => r.Max(s => s.FieldToMaximize))
.Join(
myTable,
r => r,
r => r.FieldToMaximize,
(o, i) => i)
Teraz przypuśćmy, że chcę to rozwinąć na własną metodę. Próbowałem pisząc w ten sposób:
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);
}
Niestety nie kompiluje: maxKeySelector jest wyrazem (więc nie można nazwać go na badania, a nawet nie można przekazać go do Max Spróbowałem więc przepisywanie,. podejmowania maxKeySelector funkcję zamiast wyrażenia.
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);
}
teraz kompiluje Ale to nie w czasie wykonywania: „Nieobsługiwane przeciążenia używanego do operatora zapytania«Max»” to jest to, co ja utknąłem na: muszę znajdź właściwy sposób przekazania maxKeySelector do Max().
Wszelkie sugestie? ing LINQ do SQL, co wydaje się mieć znaczenie.
Cóż, jest to zdecydowanie bardziej zwięzłe, ale niestety nie działa. Dostaję prawie taki sam błąd jak poprzednio: "Nieobsługiwane przeciążenie używane dla operatora zapytania" OrderBy "". – ctkrohn
@ctkrohn: Z jakiego dostawcy LINQ korzystasz? Działa to dobrze dla mnie na LINQ do Entities .... i LINQ to Objects. – StriplingWarrior
Ten jest LINQ do SQL. – ctkrohn