我正在尝试使用实体框架来创建复杂的查询并陷入联接。在浏览了一些文档之后,我似乎无法找到正确的解决方案,所以也许这里有人可以提供帮助。
我有一个数据结构,其中一个家庭有几个家庭成员,每个家庭成员可以在收入表中(在不同的注册日期)有多个条目,并且可以在healthconditions表中有多个条目。
我想获得的是以下查询的结果
select [some stuff] from FamilyMember fm
left join FamilyMemberIncome fmi on fm.id=fmi.familymemberid
left join Education e on e.id=fmi.educationid
left join FamilyMemberHealthCondition fmhc on fm.id=fmhc.familymemberid
left join HealthCondition hc on fmhc.healthconditionid=hc.id
这显然会为单个家庭成员返回多个结果,但没关系。 我在代码中的尝试是这样开始的(但是不正确:“id不是匿名类型的成员”)
Dim familyMembers As IQueryable = database.FamilyMember _
.Join( _
database.FamilyMemberIncome, _
Function(fm) fm.id, _
Function(fmi) fmi.familymemberid, _
Function(fm, fmi) New With { _
.fmEducation = fmi.Education, _
.fmIncome = fmi.averagemonthlyincome, _
.fmProfession = fmi.profession _
}
) _
.Join( _
database.FamilyMemberHealthCondition, _
Function(fm) fm.id, _
Function(fmhc) fmhc.familymemberid, _
Function(fm, fmhc) New With { _
.fmHealthCondition = fmhc.HealthCondition
}
)
有人可以告诉我(或指向我的文章解释)这样做的正确方法吗?
答案 0 :(得分:1)
好的,因为你的寂寞在顶部:))也许你在同一时间自己想出来了,但语法会是这样的:
From fm in FamilyMember
Join fmi In FamilyMemberIncome On fm.id Equals fmi.familymemberid
Join e In Education On fmi.educationid Equals e.id
Join fmhc In FamilyMemberHealthCondition On fm.id Equals fmhc.familymemberid
Join hc In HealthCondition On fmhc.healthconditionid Equals hc.id
Select New With { .Name = fm.Name, .Income = fmi.Income, ...more... }
(为了简洁而省略database.
部分)
这就是所谓的综合语法。我个人更喜欢流利的或链式语法(FamilyMember.Select(...)
),除了和连接。特别是连续的多个连接使得处理结果选择器功能变得非常困难并且很快使代码变得混乱。
掌握linq的最好方法,一直是我的经验,就是这么做的。当linq被引入时,我查看了IEnumerable的MSDN文档,并对每种扩展方法进行了一些练习。事实证明这非常有用。
了解Join和GroupJoin之间的区别在Linq-to-Sql或EF中特别有用。前者转换为内连接,后者转换为外连接。