2017-02-21 6 views
0

Ich muss die Datensätze für den angemeldeten Benutzer oder die Datensätze für alle Benutzer auswählen, wenn der angemeldete Benutzer der Manager ist.NHibernate QueryOver "where true auswählen"

int userId = 1; 
bool isManager = true; // or false ; 

IQueryOver<Demanda, Demanda> Query1 = 
nhibernateSession.QueryOver<Demanda>(() => DemandaAlias) 
    .Where(() => 
     (DemandaAlias.userID == userId) || 
     (isManager) 
); 

, die auf SQL someting wie folgt übersetzen würde:

Select * from Demanda wo Demanda.userId = 1 oder 1 = 1

Wie kann ich weiß die "Konstante" Parameter?

+0

Könnten Sie Demanda Klasse zeigen? –

Antwort

1

Die üblichste Methode besteht darin, eine if Anweisung in C# anzuwenden, während die Abfrage erstellt.

var query = nhibernateSession 
    .QueryOver<Demanda>(() => DemandaAlias); 

var someTestIfShouldApplyThisFilter = ...; 

if (someTestIfShouldApplyThisFilter) 
{ 
    query = query.Where(() => (DemandaAlias.ID == userId); 
} 

und später können wir diesen Bezug verbrauchen eine Liste erhalten (oder gelten/nicht andere gelten, wo die Bedingungen auf der Grundlage andere if-Anweisungen)

query.List<Demanda>(); 
0

Radim's Antwort perfekt ist, aber Ich wollte weniger Nhibernate/C# -Code schreiben. Fand heraus, dass dies:

IQueryOver<Demanda, Demanda> Query1 = 
nhibernateSession.QueryOver<Demanda>(() => DemandaAlias) 
    .Where(() => 
     (DemandaAlias.ID == userId) || 
     (isManager==true) //<==== 
); 

tatsächlich funktioniert wie gewünscht, während diese

IQueryOver<Demanda, Demanda> Query1 = 
    nhibernateSession.QueryOver<Demanda>(() => DemandaAlias) 
     .Where(() => 
      (DemandaAlias.ID == userId) || 
      (isManager) //<==== 
    ); 

Werden Sie Fehler eine Laufzeit geben.

+0

Darf ich fragen, warum Sie QueryOver anstelle von LINQ (Query-Methode) verwenden? Das wäre trivial, wenn man es benutzt. Es kann natürlich gute Gründe geben. –

+0

Frag lieber eine andere getrennte Frage, anstatt eine Antwort mit einer Frage darin zu schreiben. Sie können Ihren ersten Blockcode als Ihre eigene Antwort auf Ihre erste Frage hinterlassen und eine neue Frage stellen, ob QueryOver explizite boolesche Vergleiche benötigt oder nicht. (Offensichtlich benötigt es explizite.) –

+0

In Bezug auf Ihre eigene Lösung, ja, das funktioniert, aber ich persönlich vermeiden Verschiebung Logik ohne Bezug auf die abgefragten Zeilen von iterativen Code zu SQL. Sonst tendieren Sie eher dazu, früher Probleme mit der Abfrageleistung zu bekommen. –

Verwandte Themen