nHibernate包查询问题

时间:2009-05-05 16:15:19

标签: c# nhibernate

我在nHibernate中有以下场景(对于搞砸的XML很抱歉,但是当我试图复制它的时候,文本编辑器“帮助我”太多了一些; - ))

<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>

<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>

我需要能够编写一个查询来返回组集合中的所有用户。

基本上我想要执行以下sql:

<class>

我知道我可以在HQL中执行此操作,但我想使用ICriteria接口执行此操作。

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)

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

我已经尝试了上述但是错误,我似乎无法弄清楚我错过了什么。在查询中。

有人可以指出我如何构建此查询的正确方向。

谢谢, Max Schilling

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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));
}

这正是我正在寻找的。