2016-10-08 6 views
0

Comment ajouter des clauses where facultatives avec QueryOver?Ajout de paramètres optionnels où Nhibernate et QueryOver

TL; DR

Je suis en train de mettre en œuvre un formulaire de recherche pour une application et utilisez QueryOver.
Certains des paramètres de recherche sont facultatifs.

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

Répondre

3

QueryOver est différé à l'exécution comme pour les instructions Linq habituelles. Il ne s'exécutera que si vous le forcez en appelant une méthode de finalisation telle que .List<T>().

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. 

Vous devriez toujours pouvoir accéder aux alias en ligne de cette façon.

+0

Mais que faire si j'ai 2 conditions? 'query = query.AddWhere (...)'? – LosManos

+1

Il n'y a probablement aucun coût d'efficacité pour faire 'query.Where (condition1) .Where (condition2)' versus 'query.Where (condition1 && condition2)', bien sûr il y a LINQ normal, mais je suspecte que Nhibernate produise le même Requête SQL à partir de ces deux. Mais vous pouvez le faire aussi: http://stackoverflow.com/questions/22944722/what-is-the-best-way-to-dynamically-add-to-a-where-clause-in-a-hibhibate-query # 22948137 Bien que vous n'obtiendrez pas vos alias en ligne alors. – starlight54

+0

Pour ceux qui n'ont pas compris mon commentaire original (ie moi) mon commentaire était sur 'query.Where (...); query.Where (...)' où je pensais que le second appel 'Where' écraserait le premier mais il s'avère qu'ils concaténation à la place; donc la réponse est correcte. – LosManos