【问题标题】:nhibernate manytomany querynhibernate多对多查询
【发布时间】:2011-08-18 12:35:22
【问题描述】:

我是 nhibernate 的新手,我试图在数据库上创建一个查询,在项目和类别之间有许多链接。

我有一个包含 3 个表的数据库:项目、类别和一个查找表 categoryitem,如下所示:

  • categorys - 主键 categoryId

  • items - 主键 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>;


}

我只有类别和项目的业务对象。 如何创建存储库方法来查找特定类别的项目?

【问题讨论】:

    标签: nhibernate criteria


    【解决方案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))
    

    【讨论】:

    • 是的,就是这样。我会试试的。经过一番搜索,我发现这似乎也产生了我想要的结果,但不确定它的最佳实践 var itemIdsCriteria = DetachedCriteria.For(typeof(Item)).CreateCriteria("Categories").SetProjection(Projections.Distinct(Projections. Property("Id"))).Add(Restrictions.Eq("Id", category.Id)); //附加主要条件,如这个条件。Add(Subqueries.PropertyIn("Id", itemIdsCriteria));
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多