2010-08-06 1 views
4

(код ниже был обновлен и работает должным образом)InvalidOperationException: Нет метод "Где от типа«System.Linq.Queryable»совместим с указанными аргументами

Существует динамическая выборка OrderBy из LINQPad. Я хочу просто просто применить «Where», а не «OrderBy» для этого образца. Вот не мой код:

IQueryable query =    
    from p in Purchases 
    //where p.Price > 100 
    select p; 

string propToWhere = "Price"; 

ParameterExpression purchaseParam = Expression.Parameter (typeof (Purchase), "p"); 
MemberExpression member = Expression.PropertyOrField (purchaseParam, propToWhere); 

Expression<Func<Purchase, bool>> lambda = p => p.Price < 100; 
lambda.ToString().Dump ("lambda.ToString"); 


//Type[] exprArgTypes = { query.ElementType, lambda.Body.Type }; 
Type[] exprArgTypes = { query.ElementType }; 

MethodCallExpression methodCall = 
    Expression.Call (typeof (Queryable), "Where", exprArgTypes, query.Expression, lambda); 

IQueryable q = query.Provider.CreateQuery (methodCall); 
q.Dump(); 
q.Expression.ToString().Dump("q.Expression"); 

Этот код получает исключение: «InvalidOperationException: Ни один метод" Где по типу „System.Linq.Queryable“ совместим с указанными аргументами.»

Любая помощь с оценкой.

Приветствия

ответ

2
  1. Используйте лямбда, что Джон Скит поставляется. Возможно, он также может объяснить, почему ParameterExpression настолько болезненная для использования и требует использование же экземпляра, вместо того, чтобы быть в состоянии быть согласовано по имени :)

  2. Изменить эту строку:

Type[] exprArgTypes = { query.ElementType }; 

exprArgTypes это параметры типа к

IQueryable<TSource> Where<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate). 

Как видите, он имеет только один параметр типа - TSource, который является Purchase. Что вы делали, по сути, звали Where метод с двумя параметрами типа, как показано ниже:

IQueryable<Purchase> Where<Purchase, bool>(this IQueryable<Purchase> source, Expression<Func<Purchase, bool>> predicate) 

После того, как оба этих исправлений в выражении работает без проблем.

4

Ваше творение лямбда-выражение выглядит странно для меня. Вы добавляете еще один параметр без видимой причины. Вы также используете Predicate<Purchase> вместо Func<Purchase, bool>. Попробуйте это:

LambdaExpression lambda = Expression.Lambda<Func<Purchase, bool>>(
        Expression.GreaterThan(member, Expression.Constant(100)), 
        purchaseParam); 
+0

Привет, Джон, спасибо за ваш ответ. Выражаемое вами выражение жалуется «Бинарный оператор GreaterThan не определен для типов« System.Decimal »и« System.Int32 ».» – Zalan

+0

Ах. Вы не дали понять, что «Цена» является десятичной. Я подозреваю, что самое простое решение - изменить 100-100 м. –