我有以下课程:
public class testClass
{
public string name { get; set; }
public int id { get; set; }
public int age { get; set; }
}
和以下代码:
var list = new List<testClass>();
list.Add(new testClass { name = "name", id = 1, age = 30 });
list.Add(new testClass { name = "name", id = 2, age = 22 });
list.Add(new testClass { name = "name", id = 3, age = 20 });
list.Add(new testClass { name = "name", id = 4, age = 30 });
list.Add(new testClass { name = "name", id = 5, age = 27 });
list.Add(new testClass { name = "name", id = 6, age = 30 });
var qble = list.AsQueryable();
var pred = PredicateBuilder.New<testClass>();
pred.Or(x => x.name == "name" && x.id == 1);
pred.Or(x => x.age == 30);
var predQuery = qble.AsExpandable().Where(pred);
我的目标是创建一个返回所有记录的查询:
id = 1 and name = "name"
OR
age = 30
因此,对于上面的查询,它应该返回索引0,1,5
的项目对于上面的查询,我可以按照自己的意愿进行操作。
但是,我现在想要通过组合一组查询来构建谓词,而不是显式定义它们。所以我现在有以下2个查询:
var query1 = list.Where(x => x.name == "name" && x.id == 1);
var query2 = list.Where(x => x.age == 30);
我希望基于变量query1
和query2
构建查询,而不是明确定义条件 - 因为这些条件将被动态定义,我不知道它们是什么,并且它们是将在不同的地方定义。
我的猜测是我需要做这样的事情(从上面继续):
var qble = list.AsQueryable();
var query1 = list.Where(x => x.name == "name" && x.id == 1);
var query2 = list.Where(x => x.age == 30);
var pred = PredicateBuilder.New<testClass>();
pred.Or(query1);
pred.Or(query2);
var predQuery = qble.AsExpandable().Where(pred);
但这并不完全正确,因为谓词构建器不会将查询作为参数接受。
可以这样做吗?
答案 0 :(得分:2)
您可以创建两个Predicate<T>
并在最后的.Where
来电中调用它们。
var qble = list.AsQueryable();
var query1 = new Predicate<testClass>(x => x.name == "name" && x.id == 1);
var query2 = new Predicate<testClass>(x => x.age == 30);
var predQuery = qble.AsExpandable().Where(x => query1(x) || query2(x));
或者您可以预先构建另一个Predicate<T>
并使用此
var query = new Predicate<testClass>(x => query1(x) || query2(x));
var predQuery = qble.AsExpandable().Where(query);