我刚刚开始实体框架和Linq To Entities,我正试图让我的头脑能够查询。
我的数据结构如下:
表A,B,C。
A与B有一对多的关系,B与C有一对多的关系。
我们的一个演示文稿对象由来自A,B和B的数据组成。 C给出了来自C的Id
那么,我如何在查询中表示这一点?
如何从where c.Id == myParam
查询中获取A实体?
答案 0 :(得分:4)
怎么样:
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();
对于Collection导航属性,您可以使用.Select()
var c = context.Cs.Include(i=>i.Select(j=>j.A)).Where(c => c.Id == myParam).SingleOrDefault();
答案 1 :(得分:3)
如果您确保加载对象A的所有引用以便可以访问它们,则以下内容有效。
var C = lstA.Where(p => p.B.FirstOrDefault()。C == cID);
答案 2 :(得分:2)
你可以试试这个:
var temp = from a in AList
where a.B.All(b => b.C.All(c => c.ID== myParam))
select a;
请注意AList
是List<A>
。
答案 3 :(得分:0)
有许多方法可以使用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.