我正在将一些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.
我觉得这是我有史以来最糟糕的措辞问题之一,但我有点陷害。任何帮助都会非常感谢!
答案 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
)。