在.NET中构建一个简单的表达式树

时间:2011-08-12 12:51:45

标签: .net linq-expressions

我有一个界面,用户指出它们之间的一些元素和运算符,我应该显示结果。

用户可以构建像p1 OP v1 OR p2 OP v2这样的过滤器,其中p1p2属于Person属性,例如Age, Name, Location等,v1和{ {1}}是比较值(10,'Maria','LA'),OP是比较运算符(=,<,>),OR是逻辑运算符(也可以是AND)。

例如:
v2,或另一个像 Age > 18 AND Location = 'Paris'

拥有Name Contains 'andro' AND Sex = 'm'集合和此过滤器字符串,如何使用Linq.Expressions构建和应用此表达式?

我尝试使用DynamicLinq,但实际上我在myPeople上使用“Where”时出现问题,显然不是List<Person> ...

1 个答案:

答案 0 :(得分:1)

如果您尝试将其与List<T>一起使用,我不会费心使用表达式树开头:

public static Func<T, bool> Or<T>(Func<T, bool> predicate1,
                                  Func<T, bool> predicate2)
{
    return t => predicate1(t) || predicate2(t);
}

public static Func<T, bool> And<T>(Func<T, bool> predicate1,
                                   Func<T, bool> predicate2)
{
    return t => predicate1(t) && predicate2(t);
}

然后你可以这样做:

Func<Person, bool> isAdult = person => person.Age > 18;
Func<Person, bool> isInParis = person => person.Location == "Paris";

var personInParis = And(isAdult, isInParis);

如果您希望稍后使用表达式树,请查看PredicateBuilder

棘手的一点很可能就是将你的字符串转换为一个表达式树来开始。

如果动态LINQ执行您想要的所有 else ,您只需使用AsQueryableIQueryable<T>创建IEnumerable<T>