2011-08-18 101 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