Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#谓词生成器,带use和OR_C#_Linq_Predicatebuilder - Fatal编程技术网

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);