【问题标题】:Entity Framework query across multiple levels of relationship跨多个关系级别的实体框架查询
【发布时间】:2011-05-13 12:08:35
【问题描述】:
我刚刚开始使用 Entity Framework 和 Linq To Entities,并且正在努力解决查询问题。
我的数据结构如下:
表 A、B、C。
A 与 B 具有一对多关系,B 与 C 具有一对多关系。
我们的一个表示对象由来自 A、B 和 C 的数据组成,给定来自 C 的 Id
那么,如何在查询中表示这一点?
如何从 where c.Id == myParam 查询中获取 A 实体?
【问题讨论】:
标签:
c#
.net
linq-to-entities
【解决方案1】:
怎么样:
var c = context.Cs.Include("B.A").Where(c => c.Id == myParam).SingleOrDefault();
其中B 是从C 到B 实例的导航属性A 是从B 到A 实例的导航属性。
如果 System.Data.Entity 命名空间被重新定义,您也可以使用 lambda 表示法:
var c = context.Cs.Include(i=>i.B.A).Where(c => c.Id == myParam).SingleOrDefault();
对于集合导航属性,您可以使用 .Select()
var c = context.Cs.Include(i=>i.Select(j=>j.A)).Where(c => c.Id == myParam).SingleOrDefault();
【解决方案2】:
如果您确保已加载对象 A 的所有引用以便您可以访问它们,则以下方法有效。
var C= lstA.Where(p => p.B.FirstOrDefault().C == cID);
【解决方案3】:
你可以试试这个:
var temp = from a in AList
where a.B.All(b => b.C.All(c => c.ID== myParam))
select a;
注意AList 是List<A>。
【解决方案4】:
使用 LINQ 做事的方法有很多,有时我发现如果我很难想出一个使用现有扩展方法组合的解决方案,我会简单地编写一个连接(就像你将在 sql 中)使用 LINQ。下面的联接不需要实际的“加入”部分,因为 EF 将使用您现有的映射(导航属性)为您生成联接。
var query = from a in Ta
from b in Tb
from c in Tc
where C.Id == myParam
select new { A = a, B = b, C = c};
从这里你有一个匿名类型,它包含来自所有三个表的数据。最好的部分是 EF 会自动修复您的对象,这意味着您可以从您的方法中仅返回 A 并能够遍历它以获取 B 和 C。