Как видно из названия говорит, что я пытаюсь построить дерево выражения для source.OrderByDescending (этот источник, выражение, компаратор)Linq Expression Tree 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 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.
Любая идея, что я делаю неправильно? Я чувствую, что я довольно близко.
Entity Framework не может работать с пользовательским компаратором 'NumericStringComparer', следовательно,«не может быть переведен в выражение магазина». –
[Поддерживаемые и неподдерживаемые методы LINQ (LINQ to Entities)] (https://msdn.microsoft.com/en-us/library/bb738550 (v = vs.110) .aspx) - ** Методы заказа: ** * Большинство методов упорядочения LINQ поддерживаются в LINQ to Entities **, за исключением тех, которые принимают IComparer **, потому что компаратор не может быть переведен в источник данных. * –
Конечно. Большой контроль с моей стороны. Благодаря! –