0

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

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 (...)并从内存树中构建列表会更好吗?

4

1 回答 1

0

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

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

是的。如果没有太多数据并且这是一个选项,那么它是最简单、最快、维护成本低、最不复杂的方法。

于 2013-01-07T04:16:04.057 回答