2

次のテーブル構造があります。

ここに画像の説明を入力

Linq To SQL を使用して、次のようなリストを取得したいと考えています。

new {
    E = e,      // the E object
    Ds = e.Ds,  // list of D objects referenced by E
    NumAs = ??? // COUNT OF A objects that are eventually associated with this E
}

しかし、私はこれらのものを各Eに関連付けられたAの数でソートしたいと思っています.

joins/orderby とネストされたクエリの組み合わせを使用しようとしていますが、それを取得する方法がわかりません。

テーブル E からテーブル A への参照を作成すると、それは些細なことのように思えます。すなわちこれ:

ここに画像の説明を入力

from e in ctx.E
orderby e.As.Count()
select new {
   E     = e,
   Ds    = e.Ds,
   numAs = e.As.Count()
} 

しかし、その参照は、ある種の DB 正規化ルールを破っているのでしょうか?

4

2 に答える 2

1

まあ、エンティティの関係をずっとたどってください:

ctx.E.Select(e => new {
                 E = e
               , Ds = e.Ds
               , numAs = e.Ds.SelectMany(d => d.Cs).SelectMany(c => c.As).Count()
                 }
             )
     .OrderBy(e => e.numAs);

e.Ds.SelectMany(d=>d.Cs)Dを介してeに関連付けられたすべてのCを提供します。
繰り返しにSelectMany(c => c.As)なりますが、C と D を介して e に関連付けられているすべての As を指定します。

于 2013-04-04T14:57:08.877 に答える
1

あなたはこれを行うことができます

from e in ctx.E
let ds = e.Ds
let cs = ds.SelectMany(d => d.Cs)
let as = cs.SelectMany(c => c.As)
orderby as.Count()
select new {
   E     = e,
   Ds    = e.Ds,
   numAs = as.Count()
} 

またはこれ、簡潔にするために

from e in ctx.E
let as = e.Ds.SelectMany(d => d.Cs).SelectMany(c => c.As)
orderby as.Count()
select new {
   E     = e,
   Ds    = e.Ds,
   numAs = as.Count()
} 

それを行う別の方法は、As から始めて、次のようにグループ化することです。

from a in ctx.A
group a by a.C.D.E into g
orderby g.Count()
select new {
    E = g.Key,
    Ds = g.Key.Ds,
    numAs = g.Count()
}
于 2013-04-04T14:51:21.460 に答える