2013-06-29 79 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