NHibernate - 有效搜索分层数据的标准

时间:2013-01-06 18:14:22

标签: nhibernate

假设我们有一个像这样的对象模型:

public class Category
{
    public virtual Category Parent { get; set; }
    public virtual string Name { get; set; }
    public virtual ISet<Category> Children { get; protected set; }
}

public class Product
{
    public virtual string Name { get; set; }
    public virtual Category Category { get; set; }
    public virtual decimal Price { get; set; }
}

在数据库方面,关系将通过多对多关系表来完成,因此数据模式将是这样的:

Category
=================
Id int PK
Name varchar(50)
Parent_Id int FK

Product
=================
Id int PK
Name varchar(50)
Price money

ProductToCategory
=================
Product_Id int PK
Category_Id int PK

现在让我们假设在类别树中是一个看起来像这样的分支:

  • 食品
    • 螺母
      • 腰果
      • 花生
      • 山核桃
    • 面包
      • 黑麦
      • 小麦

假设我们的产品可能只分配了一个子类别,是否可以构建一个Criteria,它将返回所有类别为Food的产品,只需对数据库进行一次点击即可使用CTE?

或者,鉴于不会有丰富的类别,最好将完整的类别地图加载到内存中并构建标准,以便搜索产品where Category_Id in (...)并构建列表内存树?

1 个答案:

答案 0 :(得分:0)

您必须使用CTE才能执行此操作。我想不出一个SQL查询会在不使用的情况下加载分层类别的所有产品,更不用说让NHibernate为你做了。

  
    

或者,鉴于不会有丰富的类别,最好将完整的类别地图加载到内存中并构建标准,以便搜索(...)中的Category_Id和列表中的产品是从内存树构建的吗?

  

是。如果没有太多数据,这是一个选项,它是最简单,最快速,最低维护,最简单的方法。