2013-06-29 42 views
0

使用标准与过滤器我有以下各表功能NHibernate - 查询的连接表

  • 用户 - Primary列 - 编号等详细列
  • - 主柱 - Id和其他细节列
  • UserDepartment - 主列 - Id和其他列是UserId和DepartmentId

我想查找所有在部门中的用户 - (1和2)。 我也想找到所有在部门中的用户 - (1或2)。

有人可以建议我让部门(1和2)的所有用户的标准?获取部门所有用户的另一个标准 - (1或2)?

我是FluentNHibernate的新手,所以没有尝试过任何东西,因为我发现Google搜索没有任何相关的东西?在Google搜索的帮助下,我能够写出1-1关系的标准,但不适用于上述情况。

+0

欢迎的StackOverflow!你有什么尝试,什么不适合你? –

+0

我是FluentNHibernate的新手,所以没有尝试过任何东西,因为我在Google搜索中找不到任何相关内容?在Google搜索的帮助下,我能够写出1-1关系的标准,但不适用于上述情况。 – user2534947

回答

1

假设下面的类

class User 
{ 
    public virtual int Id { get; private set; } 
    public virtual ICollection<Department> Departments { get; private set; } 
} 

class Department 
{ 
    public virtual int Id { get; private set; } 
} 

class UserMap : ClassMap<User> 
{ 
    public UserMap() 
    { 
     Id(x => x.Id); 
     HasManyToMany(x => x.Departments) 
      .Table("UserDepartment") 
      .ParentKeyColumn("UserId") 
      .ChildKeyColumn("DepartmentId"); 
    } 
} 

然后查询1或2

var results = session.QueryOver<User>() 
    .JoinQueryOver<Department>(x => x.Departments) 
     .Where(d => d.Id.IsIn(departmentIds)) 
    .List(); 

查询1和2

User userAlias = null; 
var subquery = session.QueryOver<Department>() 
    .Where(d => d.User.Id == userAlias.Id && d.Id.IsIn(departmentIds)) 
    .Select(Projections.RowCount()); 

var results = session.QueryOver<User>() 
    .WithSubquery.WhereValue(departments.Count).Eq(subquery) 
    .List(); 
+0

感谢您的回复..但它不工作......首先它不能在查询中获得d.Id。我想,这是因为d代表部门的集合。如果我在x.Departments上应用where条件,则IsIn选项不可用。我错过了什么?其他怀疑我是IsIn可能会给用户在任一部门1或2,但我想要的用户谁都与部门1和2相关联。 – user2534947

+0

编译器有时不会使用正确的JoinQueryOver重载我将编辑 – Firo

+0

谢谢,在QueryOver逻辑的帮助下,我能够创建标准并解决了我的问题。还有一件事我想知道,也就是说,建议使用“QueryOver”还是“CreateCriteria”? – user2534947