选择性的Linq孩子包括两层深

时间:2013-04-05 17:55:52

标签: linq entity-framework include

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

基本上我需要来自表A,B和C的数据,其中C有一个B的外键,而B有一个A的外键。但我不希望每个C都有一个FK到B,只是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.

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

1 个答案:

答案 0 :(得分: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)。

相关问题