私のアプリケーションでは、テーブルをグループ化してから、そのグループの最大値を持つ行を返さなければならないことがよくあります。これは、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を使用すると、違いがあるようです。すべての
これは間違いなく簡潔ですが、残念ながらうまくいきません。これまでと同じエラーが発生します。「クエリ演算子 'OrderBy'にサポートされていないオーバーロードが使用されています。 – ctkrohn
@ctkrohn:どのLINQプロバイダを使用していますか? LINQ to Entities ....とLINQ to Objectsで私はうまく動いています。 – StriplingWarrior
これはLINQ to SQLです。 – ctkrohn