2016-10-08 1 views
0

Wie füge ich optionale Where-Klauseln mit QueryOver hinzu?Hinzufügen optionaler wo Parameter mit Nhibernate und QueryOver

TL; DR

Ich versuche, ein Suchformular für eine Anwendung zu implementieren und QueryOver verwenden.
Einige der Suchparameter sind optional.

  var query = 
      myDatabase.QueryOver(() => customerAlias) 
       .JoinAlias(() => customerAlias.Projects,() => projectAlias) 
       .Where(() => projectAlias.IsClosed >= 1) 
       ... possibly add more stuff 

Antwort

3

QueryOver ist in Ausführung wie für normale Linq-Anweisungen verzögert. Es wird nur ausgeführt, wenn Sie es erzwingen, indem Sie eine Finalisierungsmethode wie .List<T>() aufrufen.

var query = 
    myDatabase.QueryOver(() => customerAlias) 
     .JoinAlias(() => customerAlias.Projects,() => projectAlias) 
     .Where(() => projectAlias.IsClosed >= 1); 

if (myCondition) { 
    query = query.Where(...); 
} 

var result = query.List<T>(); //Or however else you want to make it execute. 

Sie sollten weiterhin auf diese Weise auf die Inline-Aliase zugreifen können.

+0

Aber was ist, wenn ich 2 Bedingungen habe? 'query = query.AddWhere (...)'? – LosManos

+1

Es gibt wahrscheinlich keine Effizienz Kosten zu tun 'query.Where (condition1) .Where (condition2)' versus 'query.Where (condition1 && condition2)' natürlich gibt es in normalen LINQ, aber ich vermute, Nhibernate würde das gleiche erzeugen SQL-Abfrage von beiden. Aber Sie können das auch tun: http://stackoverflow.com/questions/22944722/what-ist-best-way-to-dynamic-add-to-a-where-clause-in-a-nibernate-query # 22948137 Obwohl Sie dann Ihre Inline-Aliase nicht erhalten. – starlight54

+0

Für diejenigen, die meinen ursprünglichen Kommentar (dh mich) nicht verstanden haben, war mein Kommentar über 'query.Where (...); query.Where (...)', wo ich dachte, der zweite 'Where' Aufruf würde das überschreiben der erste, aber es stellt sich heraus, dass sie stattdessen verketten; Also ist die Antwort richtig. – LosManos

Verwandte Themen