Entity Frameworkの3つのテーブルの結合


133

3つのテーブルを結合しようとしていますが、方法を理解できません...

2つのテーブルの結合を完了しました

        var entryPoint = dbContext.tbl_EntryPoint
            .Join(dbContext.tbl_Entry,
                c => c.EID,
                cm => cm.EID,
                (c, cm) => new
                {
                    UID = cm.OwnerUID,
                    TID = cm.TID,
                    EID = c.EID,
                }).
            Where(a => a.UID == user.UID).Take(10);

テーブル

TID PK を含むtbl_Titleテーブルを含め、タイトルフィールドを取得したいと思います。

どうもありがとう


この関連記事をご覧ください。これは、メソッドの表記を使用していないけど、あなたは要点...得ることができる必要があります stackoverflow.com/questions/11204367/...
xspydr

拡張ナビゲーションプロパティで画像を表示してください。ナビゲーションプロパティは既製の結合です。
Gert Arnold

回答:


202

構文ベースのクエリを使用する方が簡単になると思います。

var entryPoint = (from ep in dbContext.tbl_EntryPoint
                 join e in dbContext.tbl_Entry on ep.EID equals e.EID
                 join t in dbContext.tbl_Title on e.TID equals t.TID
                 where e.OwnerID == user.UID
                 select new {
                     UID = e.OwnerID,
                     TID = e.TID,
                     Title = t.Title,
                     EID = e.EID
                 }).Take(10);

そしてorderbyTop(10)正しいトップ10アイテムを確実に返すために、おそらく句を追加する必要があります。


3
この方法をありがとうございました。明確に動作しますが、私は私が尋ねたように答えを確認したいと思います。
ErçinDedeoğlu

@MarcinJuraszek:機能するViewModelが必要な場合、テーブルを結合する必要がありますか?
Vini

これは非同期がなくても機能しません。私は正確なシナリオを持っていますが、クエリが例外をスローします[the_list_of_all_return_variables] 'はシリアル化できません。@marcinJuraszek -あなたが見てもらえstackoverflow.com/questions/42453123/...
sandiejat

1
パーフェクト!あなたは私にとても多くの時間を節約してくれました:)
MohammadHossein R

81

これはテストされていませんが、構文はラムダクエリで機能するはずです。この構文でより多くのテーブルを結合するとき、操作したい値に到達するために、新しいオブジェクトにさらにドリルダウンする必要があります。

var fullEntries = dbContext.tbl_EntryPoint
    .Join(
        dbContext.tbl_Entry,
        entryPoint => entryPoint.EID,
        entry => entry.EID,
        (entryPoint, entry) => new { entryPoint, entry }
    )
    .Join(
        dbContext.tbl_Title,
        combinedEntry => combinedEntry.entry.TID,
        title => title.TID,
        (combinedEntry, title) => new 
        {
            UID = combinedEntry.entry.OwnerUID,
            TID = combinedEntry.entry.TID,
            EID = combinedEntry.entryPoint.EID,
            Title = title.Title
        }
    )
    .Where(fullEntry => fullEntry.UID == user.UID)
    .Take(10);

17
それは恐ろしいです。このようなクエリを製品コードで見つけた場合は、すぐにリファクタリングします。ただし、質問されたとおりに回答すると+1されます。
Dan Bechard、2016年

8
@Dan好奇心が足りないのは、c、cm、およびccmのすべての命名規則では考えられていないのでしょうか。前者の場合、投稿を編集してレイアウトを改善したい場合は、ぜひお試しください。私はまだエンティティフレームワークに不慣れで、まだベストプラクティスに浸っているので、将来のユーザーのためにこの答えをより雄弁にするための提案がある場合は、支援に感謝します。
Pynt 2016年

4
私がコメントしたとき、私は正確な理由をあまり考えていなかったが、確かに命名規則は読みやすさを損なった(OPからコピーされた)。また、行の最初のカンマは読みやすさを大幅に損ない(主観的ですが)、空白/インデントはわずかに改善される可能性があります。あなたがそれを要求して以来、私はこれらすべて(IMHO)の改善を含む編集を提出しました。
Dan Bechard、2016年

2
多くの場合、コードの書式設定には偏りがありますが、ほとんどの人が見栄えを良くすることに同意する一般的な事項があります。命名規則については、私はものを本当に短い名前で呼んでいましたが、保存された数文字が読みやすさを損なうほどの十分な速度で(Intellisenseのようなものを考慮しなくても)十分に入力できるようになりました。対「EID」、「combinedEntry」対「cm」など。最終的には、他の誰かが私のコードを読むことになり、私の行数の線形関数として彼らが私を憎むのではなく、彼らが読んだり保守したりしなければならなかったコード。
Dan Bechard、2016年

5
カンマの開始行に対する引数を取得しません。私は、それが個々の条項/議論をコメントアウトすることを本当に簡単にするので、私は固い信者です。そして、それはよりきれいに見えます:-)
Auspex
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.