代码之家  ›  专栏  ›  技术社区  ›  Max Schilling

NHibernate行李查询问题

  •  1
  • Max Schilling  · 技术社区  · 16 年前

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

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

    实际上,我希望执行以下SQL:

    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接口来实现。

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

    我试过上面的方法,但它错了,我好像弄不清我缺了什么。在查询中。

    有人能给我指出正确的方向,我需要如何构造这个查询。

    谢谢, 麦克斯席林

    2 回复  |  直到 16 年前
        1
  •  0
  •   Stuart Childs    16 年前

    试试这个:

    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);
    
        2
  •  0
  •   Max Schilling    16 年前

    我最终找到了一个很好的解决方案:

    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));
    }
    

    这正是我想要的。