2016-05-19 2 views
1

Как видно из названия говорит, что я пытаюсь построить дерево выражения для 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.

Любая идея, что я делаю неправильно? Я чувствую, что я довольно близко.

+1

Entity Framework не может работать с пользовательским компаратором 'NumericStringComparer', следовательно,«не может быть переведен в выражение магазина». –

+1

[Поддерживаемые и неподдерживаемые методы LINQ (LINQ to Entities)] (https://msdn.microsoft.com/en-us/library/bb738550 (v = vs.110) .aspx) - ** Методы заказа: ** * Большинство методов упорядочения LINQ поддерживаются в LINQ to Entities **, за исключением тех, которые принимают IComparer **, потому что компаратор не может быть переведен в источник данных. * –

+0

Конечно. Большой контроль с моей стороны. Благодаря! –

ответ