簡體   English   中英

使用AND和OR的C#Predicate構建器

[英]C# Predicate builder with using AND with OR

我有以下課程:

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"

要么

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

我想基於變量query1query2構建查詢,而沒有明確定義條件 - 因為這些條件將被動態定義,我不知道它們是什么,它們將在不同的地方定義。

我的猜測是我需要做這樣的事情(從上面繼續):

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

但這並不完全正確,因為謂詞構建器不會將查詢作為參數接受。

可以這樣做嗎?

您可以創建兩個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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM