2009-05-05 6 views
1

は、私が(めちゃくちゃXMLのため申し訳ありませんが、私は;-)でそれをコピーしようとしたとき、テキストエディタは少し多すぎる「と私を助けて」いた)NHibernateは、以下のシナリオを持っているNHibernateは袋クエリの問題

<class name="TestApp.Components.User,TestApp.Components" table="Users"> 

<id name="Id" column="UserId" type="Int32" unsaved-value="0"> 
    <generator class="native"></generator> 
</id> 

<property name="UserName" type="string" length="100" not-null="false"/> 

<bag name="Groups" table="User_Group" lazy="true" > 
    <key column="UserId"></key> 
    <many-to-many class="Group" column="GroupId" /> 
</bag> 

<class>

私はグループのコレクションにあるすべてのユーザーを返すようにクエリを記述できるようにする必要があります。

select distinct username from users u, user_group ug
WHERE u.userid = ug.userid
AND (ug.groupid = 1 OR ug.groupid = 2 OR ug.groupid = 3)

は、私はHQLでこれを行うことができます知っているが、私はICriteriaインタフェースを使用して、それをしたい:

は、基本的に私は、次のSQLを実行したいです。

var session = sessionManager.GetSession();
var items = session.CreateCriteria(typeof(User));

ICriterion criterion = null; 

foreach (var groupid in Groups) 
{ 
    ICriterion tempCriterion = Restrictions.Eq("Groups.GroupId", groupid); 
    criterion = criterion == null ? tempCriterion : Restrictions.Or(criterion, tempCriterion); 
} 
items.Add(criterion); 

私は上記のそれ誤りを試してみた、と私は、私が行方不明ですかを把握するように見えることはできません。クエリ内にあります。

このクエリをどのように構造化する必要があるかについて、誰かが正しい方向に向けることができますか?

おかげで、 マックスシリング

答えて

0

私はこのための良い解決策を見つけることになった:これはまさに私が探していますないものを

if (Groups!= null && Groups.Count > 0) 
{ 
    var items = Groups.ConvertAll(i => i.Id).ToArray(); 

    criteria.CreateCriteria("Groups", "g", JoinType.LeftOuterJoin); 
    criteria.Add(Restrictions.In("g.Id", items)); 
} 

0

はこれを試してみてください:

var groupsCrit = items.CreateCriteria("Groups"); 
var groupIds = Restrictions.Disjunction(); 
foreach (var groupid in Groups) 
{ 
    groupIds.Add(Restrictions.Eq("Id", groupid)); // "Id" should be the name of the Id property on the Group class 
} 
groupsCrit.Add(groupIds);