[英]Linq Expression Tree OrderByDescending with custom comparer
正如標題所說,我正在嘗試為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();
並檢查結果,我收到以下錯誤:
LINQ to Entities無法識別方法'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])'方法,此方法無法轉換為商店表達。
知道我做錯了什么嗎? 我覺得我很親密。
支持和不支持的LINQ方法(LINQ to Entities) - Ordering Methods部分的摘錄:
LINQ to Entities支持大多數LINQ排序方法,但接受IComparer <T>的除外 ,因為比較器無法轉換為數據源。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.