假设我们有一个像这样的对象模型:
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 (...)
并构建列表内存树?
答案 0 :(得分:0)
您必须使用CTE才能执行此操作。我想不出一个SQL查询会在不使用的情况下加载分层类别的所有产品,更不用说让NHibernate为你做了。
或者,鉴于不会有丰富的类别,最好将完整的类别地图加载到内存中并构建标准,以便搜索(...)中的Category_Id和列表中的产品是从内存树构建的吗?
是。如果没有太多数据,这是一个选项,它是最简单,最快速,最低维护,最简单的方法。