Kerangka Entitas Bergabung dengan 3 Tabel


133

Saya mencoba untuk bergabung dengan tiga tabel tetapi saya tidak dapat memahami metode ini ...

Saya selesai bergabung dengan 2 tabel

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

meja

Saya ingin memasukkan tabel tbl_Title dengan TID PK dan mendapatkan bidang Judul .

Terima kasih banyak


Lihat artikel terkait ini. Itu tidak menggunakan notasi Metode tetapi, Anda harus bisa mendapatkan intinya ... stackoverflow.com/questions/11204367/…
xspydr

Tolong tunjukkan gambar dengan properti navigasi yang diperluas. Properti navigasi adalah gabungan yang sudah jadi.
Gert Arnold

Jawaban:


202

Saya pikir akan lebih mudah menggunakan kueri berbasis sintaks:

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

Dan Anda mungkin harus menambahkan orderbyklausa, untuk memastikan Top(10)mengembalikan sepuluh item yang benar.


3
Terima kasih banyak untuk metodenya; berfungsi dengan jelas tetapi saya ingin melihat jawabannya ketika saya bertanya, terima kasih banyak lagi.
Erçin Dedeoğlu

@MarcinJuraszek: jika saya memerlukan ViewModel untuk bekerja, apakah saya perlu bergabung dengan tabel?
Vini

Ini tidak berfungsi bahkan tanpa async. Saya memiliki skenario yang tepat tetapi permintaan melempar pengecualian [the_list_of_all_return_variables] 'tidak dapat diserialisasi. @marcinJuraszek - Bisakah Anda melihat stackoverflow.com/questions/42453123/…
sandiejat

1
SEMPURNA! Anda menyelamatkan saya begitu banyak waktu :)
MohammadHossein R

81

Ini belum diuji, tapi saya yakin sintaksnya harus bekerja untuk permintaan lambda. Saat Anda bergabung dengan lebih banyak tabel dengan sintaks ini, Anda harus menelusuri lebih jauh ke dalam objek baru untuk mencapai nilai yang ingin Anda manipulasi.

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
Itu mengerikan. Jika saya pernah menemukan permintaan seperti itu dalam kode produksi, saya akan segera refactor. +1 untuk menjawab pertanyaan seperti yang ditanyakan!
Dan Bechard

8
@Dan Karena penasaran apakah itu hanya tidak dipikirkan sama sekali penamaan konvensi dengan c, cm, dan ccm, atau hanya sintaks yang diperlukan untuk melakukan bergabung menggunakan linq dan lambda yang mengerikan? Jika yang pertama, dan Anda ingin mengedit posting untuk memiliki tata letak yang lebih baik, dengan segala cara memilikinya. Saya masih baru dalam kerangka entitas dan masih merendam dalam praktik terbaik sehingga jika Anda memiliki saran untuk membuat jawaban ini lebih fasih bagi pengguna di masa mendatang, saya akan menghargai bantuannya.
Pynt

4
Saya belum memberikan alasan yang tepat ketika saya berkomentar, tetapi tentu saja konvensi penamaannya tidak mudah dibaca (obv. Disalin dari OP). Juga, koma sebagai permulaan dari baris ini sangat menyakitkan keterbacaan (subyektif, bagi saya), dan spasi / indentasi bisa sedikit ditingkatkan. Saya telah mengirimkan hasil edit dengan semua peningkatan (IMHO) ini sejak Anda memintanya.
Dan Bechard

2
Pemformatan kode sering kali bias, tetapi ada hal-hal umum yang kebanyakan orang setuju terlihat lebih baik. Mengenai konvensi penamaan, saya biasa menyebut hal-hal dengan nama yang sangat pendek, tetapi saya dapat mengetik dengan cukup cepat sekarang (bahkan tidak mempertimbangkan hal-hal seperti Intellisense) bahwa beberapa karakter yang disimpan tidak sebanding dengan kerugian dalam keterbacaan dibandingkan dengan menamai hal-hal secara verbal misalnya "EntryID" vs. "EID", "gabunganEntry" vs. "cm", dll. Akhirnya, orang lain akan membaca kode saya, dan saya lebih suka mereka tidak menjadi benci kepada saya sebagai fungsi linier dari jumlah baris saya kode yang harus mereka baca / pelihara.
Dan Bechard

5
Saya hanya tidak mendapatkan argumen terhadap koma mulai baris. Saya orang yang sangat percaya, karena membuat mengomentari klausul / argumen individu sangat mudah. Dan terlihat lebih cantik :-)
Auspex
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.