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

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

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> 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"); 

此代码获得exception:“InvalidOperationException:类型’System.Linq.Queryable’上没有方法’Where’与提供的参数兼容。”

任何帮助都是评估的。

干杯

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

  2. 修改此行:

 Type[] exprArgTypes = { query.ElementType }; 

exprArgTypes是类型参数

 IQueryable Where(this IQueryable source, Expression> predicate). 

正如您所看到的,它只有一个类型参数 – TSource ,即Purchase 。 你有效地做了什么,调用Where方法有两个类型参数,如下所示:

 IQueryable Where(this IQueryable source, Expression> predicate) 

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

你的lambda表达式创建对我来说很奇怪。 你没有明显的原因添加另一个参数。 您还使用Predicate而不是Func 。 试试这个:

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