0

Entity Frameworkを使用して複雑なクエリを作成し、結合でスタックしようとしています。いくつかのドキュメントを閲覧した後、正しい解決策が見つからないようですので、ここの誰かが助けてくれるかもしれません。

家族に複数の家族がいるデータ構造があり、各家族は(異なる登録日に)収入テーブルに複数のエントリを持つことができ、健康状態テーブルに複数のエントリを持つことができます。

私が取得したいのは、次のクエリの結果です

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

これは明らかに、1人の家族に対して複数の結果を返しますが、それは問題ありません。私のコードの試みはこのように始まりました(しかし間違っています:「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

OK、一番上に孤独があるので:)...たぶん、あなたはその間に自分でそれを理解したかもしれませんが、構文は次のようになります:

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 に答える