【发布时间】:2013-01-07 22:38:34
【问题描述】:
我正在尝试创建一个表达式树,它将通过我的名为 test 的表查看 Foo 列中的所有字符串“电子邮件”。我几乎从 msdn 复制了一些小改动,但无法让它在我的表中搜索。让这个表达式树搜索的任何帮助都会很棒。非常感谢
名为Test的表结构
id int
foo char(10)
错误
类型“System.Linq.Queryable”上没有通用方法“Where”与提供的类型参数兼容
var s = new m2Entities().Test
var queryableData = new m2Entities().SaleLogs.AsQueryable<SaleLog>();
ParameterExpression pe = Expression.Parameter(typeof(string), "foo");
Expression left = Expression.Call(pe, typeof(string).GetMethod("ToLower", System.Type.EmptyTypes));
Expression right = Expression.Constant("bar");
Expression e1 = Expression.Equal(left, right);
MethodCallExpression whereCallExpression = Expression.Call(typeof(Queryable),
"Where",
new Type[] { queryableData.ElementType },
queryableData.Expression,
Expression.Lambda<Func<string, bool >>(e1,new ParameterExpression[] { pe }));
var results = queryableData.Provider.CreateQuery<string>(whereCallExpression);
【问题讨论】:
-
您是否尝试过手写相同的表达式?那会是什么样子?提示:你不能在实际上不是
string的东西上调用string.ToLower()。 -
@svick 使用普通的 linq 查询 m2Entities().Test.FirstOrDefault(x => x.Foo =='bar'); ???正常的 linq 查询工作得很好
-
但是您正在构建的查询中没有
x或.Foo。它实际上类似于foo => foo.ToLower() == "bar"。 -
我还没有完全理解表达式树,但是 msdn 页面并没有表明我需要“x”,我确实在第 3 行有“foo”来匹配我想要的列继续搜索。
-
stackoverflow.com/questions/1246576/dynamic-where-for-listt/… 是对我最有帮助的答案,以防其他人需要这个。
标签: c# .net expression-trees