C#谓词生成器,带use和OR
我有以下课程:C#谓词生成器,带use和OR,c#,linq,predicatebuilder,C#,Linq,Predicatebuilder,我有以下课程: 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",
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);
或
因此,对于上面的查询,它应该返回索引0、1、5处的项
对于上面的查询,它按照我的要求执行
但是,我现在希望通过组合一组查询来构建谓词,而不是显式地定义它们。因此,我现在有以下两个问题:
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();
预定或(查询1);
预定或(查询2);
var predQuery=qble.AsExpandable()。其中(pred);
但这并不完全正确,因为谓词生成器不会接受查询作为参数
这能做到吗 您可以创建两个
谓词
,并在中调用它们。其中
在末尾调用
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));
var qble=list.AsQueryable();
var query1=新谓词(x=>x.name==“name”&&x.id==1);
var query2=新谓词(x=>x.age==30);
var predQuery=qble.AsExpandable()。其中(x=>query1(x)| | query2(x));
或者您可以事先构建另一个谓词
,并使用该谓词
var query = new Predicate<testClass>(x => query1(x) || query2(x));
var predQuery = qble.AsExpandable().Where(query);
var query=new谓词(x=>query1(x)| | query2(x));
var predQuery=qble.AsExpandable()。其中(查询);
是否需要将查询分开?@jonathan.ihm我不确定您的意思?这听起来像是一个问题。您实际要解决/构建的是什么?“大画面”是什么?@Alex我的意思是你不能只做x.name==“name”&&x.id==1 | | x.age==30@Igor我试图创建一个动态OR子句
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);
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));
var query = new Predicate<testClass>(x => query1(x) || query2(x));
var predQuery = qble.AsExpandable().Where(query);