2017-02-21 12 views
0

ログインしたユーザーのレコードを選択する必要があります。ログインしているユーザーがマネージャーの場合は、すべてのユーザーのレコードを選択する必要があります。NHibernate QueryOver "select where true"

このようなSQLに変換いろいろ書いでしょう
int userId = 1; 
bool isManager = true; // or false ; 

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

:Demanda.userId = 1または1 = 1

私は白の "定数" にはどうすればよいDemandaから

選択*パラメータ?

+0

Demandaクラスを表示できますか? –

答えて

1

最も一般的な方法は、ステートメントをC#に適用し、はクエリを適用することです。

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) //<==== 
    ); 

はあなたにランタイムエラーを与える一方で

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

は実際に、必要に応じて動作します。

+0

なぜLINQ(Queryメソッド)ではなくQueryOverを使用しているのですか?これはそれを使用することは自明です。もちろん、良い理由があるかもしれません。 –

+0

その中に質問がある回答を書くのではなく、別の別の質問をしてください。最初のブロックコードを最初の質問に対する独自の回答として残し、QueryOverが明示的なブール比較を必要としているかどうかに関する新しい質問を投稿することができます。 (それは明示的なものが必要なようです) –

+0

あなた自身の解決策については、これはうまくいきますが、私は個人的にはクエリされた行に無関係なロジックを反復コードからSQLにシフトしないようにします。それ以外の場合は、クエリのパフォーマンスの問題が早く発生する傾向があります。 –

関連する問題