とLINQの式ツリーOrderByDescendingタイトルは私がsource.OrderByDescending(このソース、表現、比較演算)のための式ツリーを構築しようとしている言うようカスタム比較子
これは、式ツリーを生成するための私のコードです:
var orderByDescendingMethod = typeof(Queryable).GetMethods(BindingFlags.Static | BindingFlags.Public).First(m => m.Name == "OrderByDescending" && m.GetParameters().Count() == 3).MakeGenericMethod(typeof(Books), typeof(string));
var comparer = Expression.New(typeof(NumericStringComparer));
var orderByFilter = GenerateOrderByPropertyExpression<string>(propertyName);
var comparison = Expression.Call(orderByDescendingMethod, Expression.Constant(books), orderByFilter, comparer);
return Expression.Lambda(comparison);
そしてGenerateOrderByPropertyExpression方法:
private static Expression<Func<Books, T>> GenerateOrderByPropertyExpression<T>(string propertyName)
{
var parameter = Expression.Parameter(typeof(Books), "b");
var property = Expression.Property(parameter, propertyName);
var toStringMethod = typeof(object).GetMethod("ToString");
var objectString = Expression.Call(property, toStringMethod);
return Expression.Lambda<Func<Books, T>>(objectString, parameter);
}
しかし、私はlambda.Compile().DynamicInvoke();
を呼び出し、その結果を点検したときに、I G次のエラーがあります。
LINQ to Entities does not recognize the method 'System.Linq.IOrderedQueryable`1[DataAccess.Plusbog.Books] OrderByDescending[Books,String](System.Linq.IQueryable`1[DataAccess.Plusbog.Books], System.Linq.Expressions.Expression`1[System.Func`2[DataAccess.Plusbog.Books,System.String]], System.Collections.Generic.IComparer`1[System.String])' method, and this method cannot be translated into a store expression.
私は間違っていますか?私はかなり近いと感じる。
エンティティフレームワークは、カスタム比較演算 'NumericStringComparer'で作業することはできませんが、それゆえ「ストア式に変換することができません」。 –
[サポートされているLINQメソッドとサポートされていないLINQメソッド(LINQ to Entities)](** https://msdn.microsoft.com/en-us/library/bb738550(v = vs.110).aspx) - **注文方法:** *ほとんどのLINQ順序付け方法は、LINQ to Entitiesでサポートされています。ただし、Compareerをデータソースに変換できないため、IComparer **を受け付けるものを除きます。* –
もちろんです。私のところで大きな見落とし。ありがとう! –