2017-02-21 3 views
0

Je dois sélectionner les enregistrements pour l'utilisateur connecté ou les enregistrements pour tous les utilisateurs si l'utilisateur connecté est le gestionnaire.NHibernate QueryOver "sélectionnez où vrai"

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

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

Cela se traduirait par someting SQL comme ceci:

Select * from = Demanda.userId où Demanda 1 ou 1 = 1

Comment puis-je blanc la "constante" paramètre?

+0

Pourriez-vous montrer la classe Demanda? –

Répondre

1

La méthode la plus courante consiste à appliquer une instruction if en C#, tandis que génère la requête.

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

var someTestIfShouldApplyThisFilter = ...; 

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

et plus tard, nous pouvons consommer cette référence pour obtenir une liste (ou appliquer/pas appliquer d'autres où les conditions fondées sur d'autres instructions if)

query.List<Demanda>(); 
0

Radim's réponse est parfaite, mais Je voulais écrire moins de code Nhibernate/C#. Trouvé que ceci:

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

fonctionne réellement au besoin, alors que ce

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

vous donnera une erreur d'exécution.

+0

Puis-je vous demander pourquoi utilisez-vous QueryOver au lieu de LINQ (méthode Query)? Ce serait trivial de l'utiliser. Il peut y avoir de bonnes raisons, bien sûr. –

+0

Mieux vaut poser une autre question plutôt que d'écrire une réponse avec une question à l'intérieur. Vous pouvez laisser votre premier code de bloc comme votre propre réponse à votre question initiale, et postez une nouvelle question pour savoir si QueryOver a besoin de comparaisons booléennes explicites ou non. (On dirait qu'il a besoin de ceux explicites.) –

+0

En ce qui concerne votre propre solution, oui cela fonctionne, mais j'évite personnellement de déplacer la logique sans rapport avec les lignes interrogées du code itératif vers SQL. Sinon, vous avez tendance à frapper plus tôt les problèmes de performance de la requête. –