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

ここで、カテゴリのツリーに次のようなブランチがあるとします。

  • 食べ物
    • ナット
      • カシュー
      • 落花生
      • ペカン
    • パン
      • ライ麦
      • 小麦

サブカテゴリが 1 つしか割り当てられていない可能性のある製品があると仮定すると、CTE を使用せずにデータベースへの 1 回のヒットでCriteriaのカテゴリを持つすべての製品を返す を構築することは可能ですか?Food

または、豊富なカテゴリが存在しないことを考えると、完全なカテゴリ マップをメモリにロードし、製品where Category_Id in (...)を検索してリストがメモリ内ツリーから構築されるように基準を構築する方がよいでしょうか?

4

1 に答える 1

0

これを行うには、CTE を使用する必要があります。NHibernate を使用せずに、階層カテゴリのすべての製品をロードする単一の SQL クエリは考えられません。

または、豊富なカテゴリが存在しないことを考えると、完全なカテゴリ マップをメモリにロードし、Category_Id が (...) 内にあり、リストがオフに構築されている製品を検索するように基準を構築する方がよいでしょうか。インメモリツリー?

はい。多くのデータがなく、これがオプションである場合、これは最も簡単で、最速で、メンテナンスが少なく、複雑さが最も少ない方法です。

于 2013-01-07T04:16:04.057 に答える