1

这是我在现实世界中的例子。我有 4 张桌子:

  • 计划
  • 覆盖范围
  • 涵盖成员

每个人可以有很多计划,每个计划都可以有很多承保范围。这些coverage 中的每一个都可以有许多 CoveredMember。

我需要一个对Plan.PlanType == 1and应用过滤器的查询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。这不可能吗?

4

1 回答 1

0

我相信这是通过两个部分完成的:

  1. 您的查询根据之前在此问题中讨论的条件确定您希望返回的人:实体框架。需要帮助过滤结果

  2. 正确设置您希望立即加载的实体的导航属性:http: //msdn.microsoft.com/en-us/data/jj574232.aspx

例如,如果您的 Person 实体如下所示:

public class Person {
   public List<Plan> Plans {get; set;}
   ...
}

从 dbcontext 返回数据时,您还可以通过以下include选项使用显式预加载:

 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();
....

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

编辑

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

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

 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();

再次,在无法排除故障的情况下这样做 - 我相信我也需要尝试几次才能解决这个问题。

于 2013-01-25T21:19:14.860 回答