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()
} 

但是,该引用是否违反了某种数据库规范化规则?

4

2 回答 2

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 回答
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)通过 Ds 给你所有与你的 e 相关的 Cs。
再一次,SelectMany(c => c.As)通过 Cs 和 Ds 给你所有与你的 e 相关的 As。

于 2013-04-04T14:57:08.877 回答