2012-02-15 6 views
0

NHibernateについての新しいことを学ぶのは大変柔軟です。これまでのところ、私は非常に複雑なクエリを実行する必要はありませんでしたが、これも複雑ではありませんが、最も一般的に使用されるメソッドとオブジェクト型ではこの問題がカバーされません。ここでNHibernate Criteria APIを使用して入れ子になったOR文を作成する

は私が照会したいものです。

SELECT _Table1.UserID, _Table1.ColorID, _Table1.AppID FROM _Table1 
INNER JOIN _Table2 ON _Table2.AppID = _Table1.AppID 
WHERE _Table1.ColorID= @param0 
AND (
     _Table2.WindowID = @param1 OR 
     _Table2.WindowID = @param2 OR 
     _Table2.WindowID = @param3 OR 
     ................ = @param(N - 1) 
    ) 

を、ここで私が基準のAPI

private IList<Table1Entity> FetchListByWindowId(int colorID, List<int> listOfWindowIDs) 
{ 

    var list = CurrentSession.CreateCriteria<Table1Entity>() 
       .Add(Restrictions.Eq("ColorID", colorID)) 
       .CreateCriteria("Table2EntityList"); 

    foreach (var item in listOfWindowIDs) 
    { 
     list.GetCriteriaByPath("Table2EntityList") 
      .Add(Restrictions.Eq("WindowID", Int32.Parse(item) 
    } 
} 

表1のマッピングが4つのプロパティユーザーID、ColorID、のAppIDを含んを使用しているもので、およびHasManyをTable2エンティティに追加します。私は解決策、私は明示的に(はい、私はExpression.ORを見ている「これらの式を作るか」と言うための簡単な方法があるとは思わない探しに入れてきたフル日から

HasMany<Table2Entity>(x => x.Table2EntityList) 
    .KeyColumns.Add("AppID") 
    .Not.LazyLoad() 
    .Inverse() 
    .Cascade.None(); 

それは私が望むものではない)。

NHibernateのは、私に与えているクエリは正確に私は、これは非常に些細であることが判明した場合、「論理和」

おかげで、と申し訳ありませんと、いくつかの「論理積」を交換する必要があることを除いて欲しいものです。コードの漠然としたことをお詫びしたいと思いますが、私は機密データを扱います。したがって、すべての変数名やメソッド名などを調整する必要がありました。

EDIT:NHibernateのは、現在、私に与えている クエリ:

SELECT _Table1.UserID, _Table1.ColorID, _Table1.AppID FROM _Table1 
INNER JOIN _Table2 ON _Table2.AppID = _Table1.AppID 
WHERE _Table1.ColorID= @param0 
AND (
     _Table2.WindowID = @param1 
     AND _Table2.WindowID = @param2 
     AND _Table2.WindowID = @param3 
     AND ................ = @param(N - 1) 
    ) 
+0

可能な重複:http://stackoverflow.com/questions/434138/how-to -set-more-expression-in-expressionまたは –

+0

いいえ、私はそれを見ましたが、私が得ることができるのはExpression.Orです。私が望むのは、データセット内のアイテムとフィールドが等しいことを制限することです。私は比較をしていない。しかし、私はDisjunctionを見るのに時間を費やしていません。だから私はそれを見に行きます。 – CSMHowitzer

+0

私はアイテムのセットを持っているので、Disjunction()は正しい道の一歩だと思うし、AやBやCのようなものを言いたいのですが...しかし、私はExpressions.Disjunction()を追加しました。同じクエリ。 – CSMHowitzer

答えて

5

のような何か:

var disjunction = new Disjunction() 
    .Add(Restriction.Eq("WindowID", item1)) 
    .Add(Restriction.Eq("WindowID", item2)) 
    .Add(Restriction.Eq("WindowID", item3)); 
// Or use a loop if you like... 

var list = CurrentSession.CreateCriteria<Table1Entity>() 
    .Add(Restrictions.Eq("ColorID", colorID)) 
    .CreateCriteria("Table2EntityList") 
    .Add(disjunction); 
+0

はい、これは機能しました。素晴らしいです、本当にありがとうございます。私がしたことは、違反を作成し、私のループでそれに制限を加えた後、リストを作ったことです(あなたの答えと同じです)。クエリは「SELECT * FROM TABLE1 INNER JOIN TABLE2 ON ID = ID WHERE COLOR = P0 AND(Window = P1またはP2 .... PN)」と出てきました。 – CSMHowitzer

関連する問題