2017-08-30 2 views
4

Ich habe die folgende Klasse:C# Prädikats Builder mit der Verwendung und mit OR

public class testClass 
{ 
    public string name { get; set; } 
    public int id { get; set; } 
    public int age { get; set; } 
} 

und den folgenden Code:

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

Mein Ziel ist es, eine Abfrage zu erstellen, die alle Datensätze zurückgibt, wo:

id = 1 and name = "name" 

ODER

So für die Abfrage oben, sollte es die Elemente bei Index 0 zurück, 1, 5

Für die oben stehende Abfrage es tut, wie ich will.

Allerdings möchte ich jetzt das Prädikat erstellen, indem Sie eine Reihe von Abfragen kombinieren, anstatt sie explizit zu definieren. So habe ich jetzt die folgenden zwei Anfragen:

var query1 = list.Where(x => x.name == "name" && x.id == 1); 
var query2 = list.Where(x => x.age == 30); 

und ich mag die Abfrage erstellen, basierend auf den Variablen query1 und query2, ohne explizit die Bedingungen zu definieren - wie diese Bedingungen dynamisch definiert werden, und ich weiß nicht, was sie sind, und sie werden an verschiedenen Orten definiert werden.

Meine Vermutung ist, ich so etwas wie dies tun muß (Fortsetzung von oben):

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

aber das ist nicht ganz korrekt als das Prädikat Builder wird die Abfrage nicht als Parameter akzeptieren.

Kann dies getan werden?

+0

Gibt es eine Notwendigkeit, die Abfragen zu trennen bauen? –

+0

@ Jonathan.ihm Ich bin mir nicht sicher, was du meinst? – Alex

+1

Das klingt wie ein [xy Problem] (https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Was versucht ihr eigentlich zu lösen/bauen? Was ist das "große Bild"? – Igor

Antwort

2

Sie könnten zwei Predicate<T> erstellen und sie in Ihrem .Where Aufruf am Ende aufrufen.

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

Oder Sie könnten eine andere Predicate<T> vorher und verwenden diese

var query = new Predicate<testClass>(x => query1(x) || query2(x)); 
var predQuery = qble.AsExpandable().Where(query); 
Verwandte Themen