2017-08-30 77 views
4

我有以下類:C#謂詞建設者用有或

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

,我想建立基於變量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); 

但作謂語,建設者將不接受查詢作爲參數,這是不太正確的。

可以這樣做嗎?

+0

是否有必要單獨查詢? –

+0

@ jonathan.ihm我不確定你的意思? – Alex

+1

這聽起來像是[xy問題](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。你究竟在試圖解決/構建什麼?什麼是「大畫面」? – Igor

回答

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