我想在一个对象列表中构建一个动态where表达式。
<?xml version='1.0' encoding='UTF-8'?>
<data>
<value>A1</value>
<value>B1</value>
<value>C1</value>
<value>A2</value>
<value>B2</value>
<value>C2</value>
</data>
更新:lambda.Body
<?xml version="1.0" encoding="UTF-8"?>
<test>A1</test>
然后调用where表达式:
var list = new List<Dummy>();
IQueryable<Dummy> queryableData = list.AsQueryable<Dummy>();
MethodCallExpression wherExpression =
Expression.Call(typeof(Queryable),
"Where",
new Type[] { typeof(Dummy) },
queryableData.Expression,
Expression.Lambda<Func<Dummy, bool>>(lambda.Body, lambda.Parameters.First()));
where子句正确构建,这是结果
lambda.Body = {(((x.Title.Contains("Mihai") Or x.Description.Contains("Mihai")) Or x.Comments.Contains("Mihai")) Or x.User.Contains("Mihai"))}
当我尝试可以调用where表达式时,我得到
var result = queryableData.Provider.CreateQuery<Dummy>(wherExpression).ToList();
你知道为什么,你能帮我解决一下吗?
更新 这就是表达式的构造方式:
{System.Collections.Generic.List`1[P.Dummy].Where(x => (((x.Title.Contains("Foo") Or x.Description.Contains("Foo")) Or x.Comments.Contains("Foo")) Or x.User.Contains("Foo")))}
答案 0 :(得分:1)
评论副本:
我遇到了你的问题。您为EACH属性创建一个新的ParameterExpression。他们都被称为x,但他们是不同的实例。只创建一个名为x的ParameterExpression,然后遍历所有属性。