正如标题所说,我正在尝试为源代码构建表达式树。按降序排序(此源、表达式、比较器)
这是我用于生成表达式树的代码:
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
的方法除外 ,因为比较器无法转换为数据源。