簡體   English   中英

使用自定義比較器的Linq表達式樹OrderByDescending

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM