动态在linq中使用的表达式

时间:2015-06-10 09:39:55

标签: c# lambda delegates

我想在一个对象列表中构建一个动态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")))}

1 个答案:

答案 0 :(得分:1)

评论副本:

我遇到了你的问题。您为EACH属性创建一个新的ParameterExpression。他们都被称为x,但他们是不同的实例。只创建一个名为x的ParameterExpression,然后遍历所有属性。