2009-08-26 17 views
12

これは明らかなことかもしれませんが、私は数時間前から頭を打っていて、どこが間違っているのか分かりません。ORの代わりにANDクエリを返すNHibernateの分離

NHibernateクエリにOR条件を追加するテストを行うために、小さなコードを実行しようとしています。これは私が持っているコードです

using (ISession session = NHibernateHelper.OpenSession()) 
{ 
    ICriteria criteria = session.CreateCriteria<TestObject>(); 

    int[] ids = {1, 2, 3}; 
    foreach (int id in ids) 
    { 
     ICriterion criterion = Restrictions.Eq("Id", id); 
     criteria.Add(Restrictions.Disjunction().Add(criterion)); 
    } 

    IList<TestObject> items = criteria.List<TestObject>(); 
    return items; 
} 

これは、私がIDが1から3のすべてのテストオブジェクトを返すことが期待される単純なものです。しかし、コードを実行すると、生成されたクエリはID = 1およびID = 2およびID = 3のオブジェクトを見つけることになります。これは意外にも何も返されません。

マッピングが正しく設定されています(すべてのオブジェクトを追加/編集/削除/一覧表示できます)。これらのIDを持つオブジェクトがあります。

明らかに間違っているのですか?私が見たディスジャンクションを使用したサンプルは、すべてこのように使用されています。私はちょうどそれがANDを使用し続ける理由を得ない。

ありがとうございました。

答えて

16

問題は、毎回という新しい()ループを作成しているという事実にあります。何をする必要がある:

int[] ids = {1, 2, 3}; 
ICriterion disjunction = Restrictions.Disjunction(); 
foreach (int id in ids) 
{ 
    ICriterion criterion = Restrictions.Eq("Id", id) 
    disjunction.Add(criterion); 
} 
criteria.Add(disjunction); 

構文は少し間違っている可能性が - 私は明確にするために

:-) Hibernateの男ではなく、.NETよ、あなたの元のコードは、(のようなものを生成します擬似コードで):

WHERE (OR(ID=1)) AND (OR(ID=2)) AND (OR(ID=3)) 

「OR」には何もないので、論理和は自動的に省略されました。 ChssPly76の回答に基づいて

+1

マジック、御馳走を働きました。あなたのコードを見ると理にかなっています - 個々のORを一緒に "and-ing"することは決して考えませんでした。 コードの唯一のマイナーチェンジは、次のように論理和を作成することです。 ジャンクションdisjunction = Restrictions.Disjunction(); (ICriterionには「追加」はありません)。 ありがとう! –

5

更新コード:

using (ISession session = NHibernateHelper.OpenSession()) 
{ 
    ICriteria criteria = session.CreateCriteria<TestObject>(); 
    Junction disjunction = Restrictions.Disjunction(); 

    int[] ids = {1, 2, 3}; 
    foreach (int id in ids) 
    { 
     ICriterion criterion = Restrictions.Eq("Id", id); 
     disjunction.Add(criterion); 
    } 
    criteria.Add(disjunction); 


    IList<TestObject> items = criteria.List<TestObject>(); 
    return items; 
} 
関連する問題