跨多个关系级别的实体框架查询

时间:2011-05-13 12:08:35

标签: c# .net linq-to-entities

我刚刚开始实体框架和Linq To Entities,我正试图让我的头脑能够查询。

我的数据结构如下:

表A,B,C。

A与B有一对多的关系,B与C有一对多的关系。

我们的一个演示文稿对象由来自A,B和B的数据组成。 C给出了来自C的Id

那么,我如何在查询中表示这一点?

如何从where c.Id == myParam查询中获取A实体?

4 个答案:

答案 0 :(得分:4)

怎么样:

var c = context.Cs.Include("B.A").Where(c => c.Id == myParam).SingleOrDefault();

其中BC上的导航属性B的实例,A的导航属性是从BA的实例。

如果再次询问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;

请注意AListList<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.