InvalidOperationException:类型'System.Linq.Queryable'上没有方法'Where'与提供的参数兼容

时间:2010-08-06 11:21:20

标签: c# linq linqpad

(以下代码已更新并正常运行)

来自LinqPad的动态OrderBy示例。我想要做的只是简单地为此示例应用'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'上没有方法'where'与提供的参数兼容。”

任何帮助都被评估。

干杯

2 个答案:

答案 0 :(得分:4)

你的lambda表达式创建对我来说很奇怪。你没有明显的原因添加另一个参数。您还使用Predicate<Purchase>代替Func<Purchase, bool>。试试这个:

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

答案 1 :(得分:2)

  1. 使用Jon Skeet提供的lambda。也许他也可以解释为什么ParameterExpression使用起来非常痛苦,并且需要使用相同的实例,而不是能够通过名称进行匹配:)

  2. 修改此行:

  3. 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)
    

    一旦这两个修复程序都在表达式运行中没有问题。

相关问题