Entity Framework เข้าร่วม 3 ตาราง


133

ฉันกำลังพยายามเข้าร่วมสามโต๊ะ แต่ฉันไม่เข้าใจวิธีการ ...

ฉันเข้าร่วม 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);

ตาราง

ฉันต้องการรวมตารางtbl_TitleกับTID PK และรับฟิลด์Title

ขอบคุณมาก


ตรวจสอบบทความที่เกี่ยวข้องนี้ มันไม่ได้ใช้สัญกรณ์ Method แต่คุณควรจะได้รับส่วนสำคัญ ... 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);

และคุณควรเพิ่มorderbyอนุประโยคเพื่อให้แน่ใจว่าTop(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

8
@Dan ด้วยความอยากรู้อยากเห็นมันเป็นเพียงการไม่คิดออกในรูปแบบการตั้งชื่อทั้งหมดด้วย c, cm และ ccm หรือเพียงแค่ไวยากรณ์ที่จำเป็นในการทำการรวมโดยใช้ linq และ lambda ที่น่าเกลียด? หากเป็นแบบเดิมและคุณต้องการแก้ไขโพสต์ให้มีรูปแบบที่ดีขึ้นโดยทั้งหมดจะมี ฉันยังใหม่กับเอนทิตีเฟรมเวิร์กและฉันยังคงใช้แนวทางปฏิบัติที่ดีที่สุดดังนั้นหากคุณมีข้อเสนอแนะเพื่อให้คำตอบนี้คมชัดยิ่งขึ้นสำหรับผู้ใช้ในอนาคตฉันขอขอบคุณสำหรับความช่วยเหลือ
Pynt

4
ฉันไม่ได้ให้เหตุผลที่แน่นอนมากนักเมื่อฉันแสดงความคิดเห็น แต่แน่นอนว่าหลักการตั้งชื่อทำให้อ่านไม่ได้ (obv. คัดลอกจาก OP) นอกจากนี้เครื่องหมายจุลภาคซึ่งเป็นจุดเริ่มต้นของบรรทัดยังส่งผลกระทบต่อความสามารถในการอ่านได้มาก (ส่วนตัวสำหรับฉัน) และช่องว่าง / การเยื้องอาจได้รับการปรับปรุงเล็กน้อย ฉันได้ส่งการแก้ไขพร้อมการปรับปรุง (IMHO) ทั้งหมดนี้ตั้งแต่ที่คุณร้องขอ
Dan Bechard

2
การจัดรูปแบบโค้ดมักมีความลำเอียง แต่มีสิ่งทั่วไปที่คนส่วนใหญ่เห็นว่าดีกว่า สำหรับรูปแบบการตั้งชื่อฉันเคยเรียกสิ่งต่างๆด้วยชื่อสั้น ๆ แต่ตอนนี้ฉันสามารถพิมพ์ได้เร็วพอสมควร (ไม่ได้พิจารณาถึงสิ่งต่างๆเช่น Intellisense) ว่าอักขระเพียงไม่กี่ตัวที่บันทึกไว้นั้นไม่คุ้มกับความเสียหายในการอ่านเมื่อเทียบกับการตั้งชื่อสิ่งต่างๆอย่างละเอียดเช่น "EntryID" เทียบกับ "EID", "combinationEntry" กับ "cm" ฯลฯ ในที่สุดก็มีคนอื่นมาอ่านโค้ดของฉันและฉันไม่อยากให้พวกเขาเกลียดชังฉันมากขึ้นเพราะเป็นฟังก์ชันเชิงเส้นของจำนวนบรรทัดของฉัน รหัสที่พวกเขาต้องอ่าน / ดูแลรักษา
Dan Bechard

5
ฉันไม่ได้รับอาร์กิวเมนต์เทียบกับบรรทัดเริ่มต้นด้วยเครื่องหมายจุลภาค ฉันเป็นคนที่เชื่ออย่างมั่นคงเพราะมันทำให้การแสดงความคิดเห็นแต่ละประโยค / ข้อโต้แย้งง่ายมาก และมันดูสวยขึ้น :-)
Auspex
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.