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’与提供的参数兼容。”
任何帮助都是评估的。
干杯
-
使用Jon Skeet提供的lambda。 也许他也可以解释为什么
ParameterExpression
使用起来非常痛苦并且需要使用相同的实例,而不是能够通过名称匹配:) -
修改此行:
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);