2011-05-13 100 views
4

的多层次,我刚刚在实体框架和LINQ开始到实体和实体框架查询我试图让我的身边查询头。横跨关系

我有一个数据结构如下所示:

表A,B,C。

A具有一对多的关系到B,B具有一对多的关系,以C.

一个我们的演示文稿对象由A,B的数据组成B & C给定的ID从C

所以,我该如何在查询中表示这个?

我如何从where c.Id == myParam查询的一个实体?

回答

4

什么:

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

BC导航属性的BA实例导航属性从BA实例。

您还可以使用拉姆达符号,如果System.Data.Entity的命名空间refeneced:

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

极具收藏导航属性可以使用。选择()

var c = context.Cs.Include(i=>i.Select(j=>j.A)).Where(c => c.Id == myParam).SingleOrDefault(); 
+0

完美,谢谢 – Shevek 2011-06-07 13:56:40

2

你可以试试这个:

var temp = from a in AList 
      where a.B.All(b => b.C.All(c => c.ID== myParam)) 
      select a; 

通知,AListList<A>

+0

寿hal回答l feshel hayda! !... akeed btishteghel b SETS mahek ?? – scatman 2011-05-18 13:15:11

3

下面的作品,如果你正在设法确保对象A的所有引用被加载,所以你可以访问它们。

变种C = lstA.Where(P => p.B.FirstOrDefault()C == CID);

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}; 

从这里你有一个匿名类型,它有来自所有三个表的数据。最好的部分是,英孚确实自动修复你的对象,这意味着你可以从你的方法只返回A,并能够遍历它得到B和C.