2

我正在将一些 sql 存储过程逻辑(它将返回数据集中的多个表)移植到使用 linq 查询的实体框架强类型对象。

基本上我需要表 A、B 和 C 中的数据,其中 C 对 B 有一个外键,而 B 对 A 有一个外键。但我不希望每个 C 都对 B 有 FK,只希望 C 有一定的约束 X。

所以基本上,存储过程基本上说

TableA = select from A where A.AID = AIDPassedIn
TableB = select from B where B.AID = AIDPassedIn
TableC = select from TableB where TableB.XID = XIDPassedIn 
return new DataSet(TableA, TableB, TableC);
//yes this is gross and confusing, thus our current efforts

实体框架几乎让这变得超级简单,就像这样

A.Include("B.C").Where(a => a.AID == AIDPassedIn)

我唯一的问题是这不包括 C 表上的约束 X。我读过很多文章,但我读过的所有内容都表明我可以添加到 where 子句中,这将过滤我最终得到的 A 对象。我应该只得到一个 A 对象,不管它的孩子的属性如何。我想要的是带有 AIDPassedIn 的 A,以及它的所有子 B,以及与约束 X 匹配的所有 B 的子 C。

我觉得这是我有史以来最糟糕的措辞问题之一,但我有点困惑。任何帮助都会非常感谢!

4

1 回答 1

1

您可以按照以下方式尝试:

var AList = context.As.Where(a => a.AID == AIDPassedIn)
    .Select(a => new
    {
        A = a,
        Bs = a.Bs,
        Cs = a.Bs.Select(b => b.Cs.Where(c => c.XID == XIDPassedIn))
    })
    .AsEnumerable()
    .Select(x => x.A)
    .ToList(); // or SingleOrDefault if AIDPassedIn is the PK

Include只要您不禁用更改跟踪,实体框架就会自动(即使不使用)将对象图放在一起。

于 2013-04-05T18:47:03.360 回答