Entity framework 实体框架4.0多连接
这是我真实世界的例子。 我有4张桌子: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
- 人
- 计划
- 覆盖范围
- 被覆成员
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();