【问题标题】: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 是从CB 实例的导航属性A 是从BA 实例的导航属性。

    如果 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;
        

        注意AListList<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。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-11-13
            • 2016-12-15
            • 1970-01-01
            • 1970-01-01
            • 2015-10-16
            • 2018-06-26
            • 1970-01-01
            相关资源
            最近更新 更多