0

我正在尝试使用实体框架来创建一个复杂的查询并陷入连接中。浏览了一些文档后,我似乎找不到正确的解决方案,所以也许这里有人可以提供帮助。

我有一个数据结构,其中一个家庭有几个家庭成员,每个家庭成员在收入表中可以有多个条目(在不同的注册日期),并且在健康状况表中可以有多个条目。

我想获得的是以下查询的结果

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
                }
            )

有人可以告诉我(或指向我解释的文章)这样做的正确方法吗?

4

1 回答 1

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 中特别有用。前者转化为内连接,后者转化为外连接。

于 2012-05-15T20:34:35.833 回答