2011-08-18 127 views
0

我是nhibernate的新手,試圖在數據庫上創建一個查詢項目和類別之間的manytomany鏈接。nhibernate manytomany查詢

我有3個表數據庫:項目,分類和查找表categoryitem這樣的:

  • 的categorys - 主鍵的categoryId

  • 項目 - 主鍵ITEMID

  • categoryItem - categoryId列和itemId列

我想查詢返回的項目特定類別,並已嘗試這樣做,認爲我沿着正確的線路是:

public IList<Item> GetItemsForCategory(Category category) 
     { 

//detached criteria 

DetachedCriteria itemIdsCriteria = DetachedCriteria.For(typeof(Category))  
       .SetProjection(Projections.Distinct(Projections.Property("Item.Id")))  
       .Add(Restrictions.Eq("Category.Id", category.Id)); 

       criteria.Add(Subqueries.PropertyIn("Id", itemIdsCriteria)); 

      return criteria.List<Item>() as List<Item>; 


} 

我只有類別和項目的業務對象。 我如何創建一個存儲庫方法來查找特定類別的項目?

回答

1

我假設你的類看起來是這樣的:

class Item 
{ 
    // id and stuff 
    IList<Category> Categories { get; private set; } 
} 

class Category 
{ 
    // id and stuff 
} 

查詢(HQL)

session.CreateQuery(@"select i 
from Item i 
    inner join i.Categories c 
where 
    c = :category") 
.SetEntity("category", category) 

標準

session 
    .CreateCriteria(typeof(Item)) 
    .CreateCriteria("Categories", "c") 
    .Add(Restrictions.Eq("c.Id", category.Id)) 
+0

是的,它就是這樣。我會嘗試。經過一些搜索,我發現這似乎也產生了我想要的結果,但不知道它的最佳實踐var itemIdsCriteria = DetachedCriteria.For(typeof(Item))。CreateCriteria(「Categories」)。SetProjection(Projections.Distinct(Projections。 Property(「Id」)))。Add(Restrictions.Eq(「Id」,category.Id)); //附加主標準,像這樣criteria.Add(Subqueries.PropertyIn(「Id」,itemIdsCriteria)); – user900566