2

データベース (MySql) の 2 つのテーブル間に多対多の関係があります。

  • カテゴリ (id、名前、id_parent)
  • 音(ID、名前)

カテゴリ1 つの親カテゴリを持つことができるため、カテゴリは多くの子を持つことができます。カテゴリに少なくとも 1 つの子がある場合、そのカテゴリにはサウンドがありません。サウンドと子供のカテゴリを一緒にすることはできません。

したがって、親カテゴリの場合、子を持つ可能性のある子を持つ可能性のあるすべての子を取得したい (...) と、すべての子の音を再帰的に数えたいと考えています。

例:

Cat -> (CCat1 -> CCCat11(2音), CCat2 (5音), CCat3 -> CCat31 -> CCCat311 -> (CCCCat3111 (10音), CCCCat3111 (1音))

深い制限はありません。そのため、「再帰的に」サウンドをカウントする方法が必要です。

  • 猫には3人の子供がいます。
  • CCat1 には 1 人の子がいます。
  • CCat2 には子がありません。
  • CCat3 には、2 つの子を持つ 1 つの子を持つ 1 つの子があります。

Cat.nbSounds = 18

4

3 に答える 3

3

答えはSelectManyオペレーターのユーザーにあります。

int count_soundsinparent = parentCategory
    .Select(x=> x.ChildCategory)
    .SelectMany(x=> x.Sounds)
    .Count();

通常のSelect;を使用したとします。サウンドのリスト (子カテゴリが持つサウンドごとに 1 つのアイテム) のリスト (子カテゴリごとに 1 つのアイテム) を返すため、2 次元のリストが作成されます。

そのリストのすべての要素を取得し、それSelectManyを 1 次元のリストに入れます。次に、そのリスト内の項目を数えると、合計が得られます。

于 2012-10-18T08:19:03.777 に答える
1

再帰的に

この要件は、単一のLINQクエリでそれを実行しないことを意味します。Linqは、Linq to Entitiesなどのより複雑なプロバイダーは言うまでもなく、linqtoobjectsを使用して再帰クエリを実際に表現することはできません。

説明するスキーマを使用して、ストアドプロシージャを作成することをお勧めします。入れ子集合モデルがある場合は、左端と右端の数値を数学的に操作できる可能性がありますが、これらの追加のルールではおそらく実行できません。

于 2012-10-18T08:23:58.263 に答える
0

さらに調べてみると、やりたいことができないようです。

そこで、子を取得して各カテゴリの音の数を計算する再帰メソッドを作成しました(カテゴリ内の音を数えるか、カテゴリの子の音の数を数えます)。

とにかくエンティティへのlinqを使用してそれを行う魔法の方法を見つけたら、私はそれを取ります!

于 2012-10-20T15:57:42.637 に答える