2017-02-21 111 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。否則,你往往會更快地遇到查詢性能問題。 –