Entity framework 实体框架4.0多连接

Entity framework 实体框架4.0多连接,entity-framework,entity-framework-4,Entity Framework,Entity Framework 4,这是我真实世界的例子。 我有4张桌子: 人 计划 覆盖范围 被覆成员 每个人都可以有很多计划,每个计划都可以有很多保险范围。每个覆盖范围都可以有多个覆盖成员 我需要一个将在Plan.PlanType==1和CoveredMembers.TermDate==null上应用筛选器的查询。 此查询将带回任何拥有未终止的医疗类型计划的人员 此SQL语句将执行以下操作: SELECT Person.*, Plans.*, Coverages.*, CoveredMembers.* FROM Pers

这是我真实世界的例子。 我有4张桌子:

  • 计划
  • 覆盖范围
  • 被覆成员
每个人都可以有很多计划,每个计划都可以有很多保险范围。每个覆盖范围都可以有多个覆盖成员

我需要一个将在
Plan.PlanType==1
CoveredMembers.TermDate==null
上应用筛选器的查询。 此查询将带回任何拥有未终止的医疗类型计划的人员

此SQL语句将执行以下操作:

SELECT Person.*, Plans.*, Coverages.*, CoveredMembers.* 
FROM Person P 
INNER JOIN Plan PL ON P.PersonID = PL.PersonID 
INNER JOIN Coverage C on PL.PlanID = C.PlanID 
INNER JOIN CoveredMember CM on C.CoverageID = CM.CoverageID 
WHERE CM.TermDate = NULL AND PL.PlanType = 1
我已经知道如何使用匿名类型来实现这一点,但有时我需要更新数据并保存回数据库,而匿名类型是只读的

我得到了一个使用JOIN的解决方案,但它只带回了人(尽管以我需要的方式进行过滤)。然后,我可以循环遍历每个人:

foreach (var person in persons) {
  foreach (var plan in person.Plans{
    //do stuff 
  }
}
但是,这不会为循环的每个迭代调用db吗?我有500人,每人有3个未终止的医疗计划,所以它会给db打1500次电话


这就是为什么我想一次将整个数据树从Persons恢复到CoveredMembers。这是不可能的吗?

我相信这可以通过两个部分来实现:

  • 根据您的条件确定您希望返回的人员的查询,如前一问题所述:

  • 正确设置要集中加载的实体的导航属性:

  • 例如,如果您的个人实体看起来像:

    public class Person {
       public List<Plan> Plans {get; set;}
       ...
    }
    
    如果这些是嵌套的-覆盖率是计划的一部分,等等(看起来是这样的,它是这样的):

    我在这里对您的数据模型做一些假设,上面的代码可能需要一些调整

    编辑

    我可能需要其他人在这里进行权衡,但我认为您不能像这样将where子句添加到include中(我上面的示例引导您将include放在上下文对象上,而不是返回一个IQueryable,其中包含在第一篇文章中解决的条件集(没有调用ToList())然后使用上面编写的代码,但不使用Where子句:

    从第一篇文章开始(您在这篇文章中提供了不同的标准,但概念相同)

    然后:

    List people=q.Include(p=>p.plan
    .选择(pl=>pl.coverage)
    .Select(c=>c.CoveredMembers.ToList();
    

    同样,在没有故障排除的情况下执行此操作-我相信我也需要几次尝试来解决此问题。

    我感谢您的帮助。我认为这非常接近。我可以使用includes进行快速加载,但当我尝试添加过滤器时,它会出错,这可能是因为我不太擅长语法,所以我确信我只是在做这是错误的。我对EF还是个新手,所以请原谅我。这就是我得到的。你能指出我做错了什么吗?'var people=context.Persons.Include(p=>p.plan.Where(pl=>pl.PlanTypeID==1)。Select(pl=>pl.Coverages.Select(c=>c.CoveredMembers.Where(cm=>cm.TerminationDate==null)))“抱歉,新到这个网站的人不知道如何在这里很好地格式化代码:(我认为它越来越接近了,只是它没有带回正确数量的结果。我有一个查询,我知道它肯定是正确的,它带回了5004个结果。当我在EF中这样做时,它只带回1314个结果。我正在查看生成的sql,它的方式比需要的更复杂,但where子句似乎是正确的。此时,如果它以您希望的方式返回结果(即急切加载),则很难确定查询的不同之处。您能否发布您当前使用的实际(当前)SQL查询和完整linq查询?当我遇到此问题时(我有:)我通常会简化两个查询并确保获得相同的数据,然后添加连接等,直到确定分歧点。我在连接中有一列出错。当我更正它时,它现在返回8800行。这次太多了。我确实将您的答案标记为正确,因为我非常确定它工作正常,只是不确定为什么不正确sql没有返回正确的结果。
     var people = context.People
             .Include(p => p.Plans)
             .ToList();
    ....
    
     var people = context.People
             .Include(p => p.Plans.Select(pl=>pl.Coverage).Select(c=>c.CoveredMembers)))
             .ToList();
    ....
    
     var q = from q1 in dbContext.Parent
        join q2 in dbContext.Children
        on q1.key equals q2.fkey
        join q3 in  ........
        where q4.col1 == 3000
        select q1;
    
    List<Person> people = q.Include(p => p.Plans
      .Select(pl => pl.Coverages)
      .Select(c => c.CoveredMembers).ToList();