我有一个界面,用户指出它们之间的一些元素和运算符,我应该显示结果。
用户可以构建像p1 OP v1 OR p2 OP v2
这样的过滤器,其中p1
和p2
属于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>
...
答案 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 ,您只需使用AsQueryable
从IQueryable<T>
创建IEnumerable<T>
。