2012-12-07 124 views
2

我想升級現有的應用程序使用NHibernate。我的數據庫有以下表格:NHibernate的 - LINQ查詢多對多問題

Sites: 
- Id (PK) 
- Name 

Categories: 
- Id (PK) 
- Name 

CategoriesSite 
- CategoryId (PK) 
- SiteId (PK) 
- Active 

對於每個類別和網站,記錄可能存在或可能不存在於CategoriesSite表中。如果某個項目存在於CategoriesSite表格中,則可以通過將活動設置爲false來關閉類別。 如果它不是,那麼它假定活動是真實的

我想創建NHibernate的LINQ查詢來過濾特定站點的類別(即有效)。例如說我有以下數據:

Sites: 
Id | Name 
1 | Site 1 
2 | Site 2 

Categories: 
Id | Name 
1 | Category 1 
2 | Category 2 

CategoriesSite: 
CategoryId | SiteId | Active 
1   | 1  | True 
1   | 2  | True 
2   | 1  | False 

我可以說:

var categories = session.Query<CategorySite>() 
         .Where(s => s.Site.Id == 2 && s.Active) 
         .Select(s => s.Category) 
         .ToList(); 

然而,這隻會得到1類,而不是2類,我想它做它。我想知道是否有人做過類似的事情,並且可能會提出一種查詢方法或提供有關如何更好地映射此場景的任何建議。

+1

請剖析生成sql查詢,並向我們展示您的映射。 – edze

回答

0

我想我已經解決了這個。我爲類別網站列表添加了針對類別的一對多收藏。這使我說:

var categories = session.Query<Category>() 
         .Where(c => !c.Sites.Any(s => s.Site.Id == 2 && !s.Active)) 
         .ToList(); 

這意味着當它在主動設置和仍然會返回類別當CategoriesSite表中沒有記錄它只會不會返回類別。

0

沒有看到生成的查詢,我只能猜測,但是,試試這個來代替:

var categories = session.Query<CategorySite>() 
        .Where(s => s.SiteId == 2 && s.Active) // not s.Site.Id 
        .Select(s => s.Category) 
        .ToList(); 
+0

嗨,謝謝,但我的查詢只是一個例子,並試圖顯示問題。我想我已經想出了一個解決方案。 – nfplee