Linq 表达式树顺序降序与自定义比较器



正如标题所说,我正在尝试为源代码构建表达式树。按降序排序(此源、表达式、比较器)

这是我用于生成表达式树的代码:

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) - 排序方法部分:

大多数 LINQ

排序方法在 LINQ to Entities 中受支持,但接受 IComparer 的方法除外,因为比较器无法转换为数据源。

最新更新