Entity Framework Join 3 Tables


133

Üç masayı birleştirmeye çalışıyorum ama yöntemi anlayamıyorum ...

2 masaya katılmayı tamamladım

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

tablolar

TID PK ile tbl_Title tablosunu dahil etmek ve Başlık alanını almak istiyorum .

Çok teşekkürler


Bu ilgili makaleye göz atın. Yöntem gösterimini kullanmıyor, ancak özü alabilmelisiniz ... stackoverflow.com/questions/11204367/…
xspydr

Lütfen genişletilmiş gezinme özelliklerine sahip bir resim gösterin. Gezinme özellikleri, hazır birleştirmelerdir.
Gert Arnold

Yanıtlar:


202

Sözdizimi tabanlı sorgu kullanmanın daha kolay olacağını düşünüyorum:

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

Ve ilk on öğeyi doğru döndürdüğünden orderbyemin olmak için muhtemelen cümle eklemelisiniz Top(10).


3
Yöntem için çok teşekkür ederim; net çalışıyor ama sorduğum gibi cevabı görmek istiyorum, tekrar çok teşekkürler.
Erçin Dedeoğlu

@MarcinJuraszek: Çalışmak için bir ViewModel'e ihtiyacım olursa, masalara katılmam gerekli mi?
Vini

Bu, asenkron olmadan bile çalışmaz. Tam senaryoya sahibim ama sorgu bir istisna atıyor [the_list_of_all_return_variables] 'serileştirilemez. @marcinJuraszek - stackoverflow.com/questions/42453123/… '
atabilir misin

1
MÜKEMMEL! bana çok zaman kazandırdın :)
MohammadHossein R

81

Bu test edilmemiştir, ancak sözdiziminin bir lambda sorgusu için çalışması gerektiğine inanıyorum. Bu sözdizimi ile daha fazla tabloyu birleştirdikçe, değiştirmek istediğiniz değerlere ulaşmak için yeni nesneleri daha ayrıntılı olarak incelemeniz gerekir.

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
Bu çok çirkin. Üretim kodunda böyle bir sorgu bulursam, hemen yeniden düzenlerdim. Yine de sorulan soruyu yanıtlamak için +1!
Dan Bechard

8
@Dan Merak ediyorum, c, cm ve ccm ile tüm adlandırma kurallarında düşünülmemiş mi, yoksa sadece linq ve lambda kullanarak birleştirmeleri gerçekleştirmek için gereken sözdizimi iğrenç mi? Birincisi ve daha iyi bir düzene sahip olmak için gönderiyi düzenlemek istiyorsanız, elbette sahip olun. Varlık çerçevesi konusunda hala yeniyim ve hala en iyi uygulamaları araştırıyorum, bu nedenle bu yanıtı gelecekteki kullanıcılar için daha anlamlı hale getirme önerileriniz varsa, yardım için minnettar olurum.
Pynt

4
Yorum yaptığım zaman kesin nedeni pek düşünmemiştim, ama kesinlikle adlandırma kuralları okunabilirliğe zarar verdi (örneğin, OP'den kopyalanmış). Ayrıca, satırın başlangıcı olarak virgül okunabilirliğe çok zarar verir (benim için öznel) ve boşluk / girinti biraz iyileştirilebilir. Siz talep ettiğinizden bu yana tüm bu (IMHO) iyileştirmeleri içeren bir düzenleme gönderdim.
Dan Bechard

2
Kod biçimlendirme genellikle önyargılıdır, ancak çoğu insanın daha iyi göründüğünü kabul ettiği genel şeyler vardır. Adlandırma kurallarına gelince, her şeyi gerçekten kısa adlar olarak adlandırırdım, ancak şu anda yeterince hızlı yazabiliyorum (Intellisense gibi şeyleri bile dikkate almıyorum), kaydedilen birkaç karakterin okunabilirlikte bozulmaya değmeyeceği ve şeylerin ayrıntılı bir şekilde adlandırılmasına karşı, örneğin "Giriş Kimliği" "EID", "birleşik Giriş" ve "cm" vb. karşılaştırması. Sonunda, başka biri kodumu okuyacak ve satır sayımın doğrusal bir işlevi olarak benden nefret etmesini Okumaları / sürdürmeleri gereken kod.
Dan Bechard

5
Virgül başlangıç ​​satırlarına karşı argümanlar anlamıyorum. Tek tek cümleleri / argümanları yorumlamayı gerçekten kolaylaştırdığı için kesin inanan biriyim. Ve daha güzel görünüyor :-)
Auspex
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.