LinqのカスタムOrderBy拡張メソッドをエンティティに書き込もうとしています。ここでは、パラメータに基づいてASCまたはDESCをソートできます。Linq to Entities - ラムダステートメントでカスタムメソッド(OrderBy)が失敗する
public static class LinqExtensions
{
public static IOrderedQueryable<TSource> OrderByExtension<TSource, TKey>(this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, bool isDescending = true)
{
return (isDescending) ? source.OrderByDescending(keySelector) : source.OrderBy(keySelector);
}
}
これは素晴らしい作品...限り、私はラムダ文の中にこのメソッドを使用していないよう:!私の最初の試みは、以下の通りでした。おもちゃの例は次のようになります。私は上記のコードを実行すると
using (var dbContext = new FooDBEntities())
{
var foo = dbContext.Fubars.SelectMany(x => dbContext.Fubars.OrderByExtension(y => y.Foo, true)).ToList();
}
プログラムが吹くと、私は次のエラーを取得する:
Unhandled Exception: System.NotSupportedException: LINQ to Entities does not recognize the method 'System.Linq.IOrderedQueryable`1[ExpressionTreeFoo.Fubar] OrderByExtension[Fubar,String](System.Linq.IQueryable`1[ExpressionTreeFoo.Fubar], System.Linq.Expressions.Expression`1[System.Func`2[ExpressionTreeFoo.Fubar,System.String]], Boolean)' method, and this method cannot be translated into a store expression.
誤差はかなりそれをすべて言います。フレームワークは、私のカスタム拡張メソッドをSQLが理解できるものに変換する方法を知らない。
私はいくつかの検索を行ってきましたが、これは可能かどうかを明確に示すものは見ていません。だから私の質問は..ラムダ式の内部で動作するカスタムOrderByメソッド(拡張メソッドかどうか)を作る方法はありますか?
あなたはそれが完全に単純なクエリで作業していますか?生成されたSQLをチェックしましたか? –
はい、確認しました。私は使用しています:context.Database.Log = s => System.Diagnostics.Debug.WriteLine(s)は、クエリを印刷します。 – Soto