2017-02-21 134 views
0

如果登录用户是管理员,我需要选择登录用户的记录或所有用户的记录。NHibernate QueryOver“select where true”

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

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

这将转换为SQL成才这样的:

选择DEMANDA *其中Demanda.userId = 1或1 = 1

我怎么白的 “常数”参数?

+0

您能否显示Demanda类? –

回答

1

最常用的方法是在C#中应用if语句,而构建查询

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

var someTestIfShouldApplyThisFilter = ...; 

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

,后来我们就可以消费,提及获取列表(或应用,其中基于其他if语句条件/不适等)

query.List<Demanda>(); 
0

Radim's答案是完美的,但我想写少Nhibernate/C#代码。发现这个:

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

实际工作的要求,而这

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

会给你一个运行时错误。

+0

我可以问你为什么使用QueryOver而不是LINQ(查询方法)?这将使用它微不足道。当然可能有很好的理由。 –

+0

更好地问另一个分离的问题,而不是写一个问题的答案。您可以将您的第一个块代码作为您最初问题的答案,并发布有关QueryOver是否需要显式布尔比较的新问题。 (它看起来像需要明确的。) –

+0

关于你自己的解决方案,是的,这是有效的,但我个人避免将与查询行无关的逻辑从迭代代码转移到SQL。否则,你往往会更快地遇到查询性能问题。 –