Entity Framework Unisci 3 tabelle


133

Sto cercando di unire tre tabelle ma non riesco a capire il metodo ...

Ho completato unire 2 tabelle

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

tavoli

Vorrei includere la tabella tbl_Title con TID PK e ottenere il campo Title .

molte grazie


Dai un'occhiata a questo articolo correlato. Non è usando la notazione metodo, ma, si dovrebbe essere in grado di ottenere il succo ... stackoverflow.com/questions/11204367/...
xspydr

Si prega di mostrare un'immagine con proprietà di navigazione espanse. Le proprietà di navigazione sono join già pronti.
Gert Arnold,

Risposte:


202

Penso che sarà più facile usando la query basata sulla sintassi:

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

E probabilmente dovresti aggiungere una orderbyclausola, per assicurarti di Top(10)restituire i primi dieci articoli corretti.


3
Grazie mille per il metodo; funziona chiaro ma vorrei vedere la risposta come ho chiesto, grazie ancora.
Erçin Dedeoğlu,

@MarcinJuraszek: se ho bisogno di un ViewModel per funzionare, è necessario che mi unisca ai tavoli?
Vini,

Questo non funziona anche senza asincrono. Ho lo scenario esatto ma la query genera un'eccezione [the_list_of_all_return_variables] 'non può essere serializzata. @marcinJuraszek - Potrebbe dare un'occhiata a stackoverflow.com/questions/42453123/...
sandiejat

1
PERFETTO! mi hai risparmiato così tanto tempo :)
Mohammad Hossein R

81

Questo non è testato, ma credo che la sintassi dovrebbe funzionare per una query lambda. Man mano che si uniscono più tabelle con questa sintassi, è necessario approfondire i nuovi oggetti per raggiungere i valori che si desidera manipolare.

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
È orribile. Se mai avessi trovato una query del genere nel codice di produzione, la avrei immediatamente riformattata. +1 per aver risposto alla domanda come posta, però!
Dan Bechard,

8
@Dan Per curiosità è solo il non pensato a tutte le convenzioni di denominazione con c, cm e ccm, o semplicemente la sintassi richiesta per eseguire i join usando linq e lambda che è orribile? Se il primo, e ti piacerebbe modificare il post per avere un layout migliore, sicuramente ce l'hai. Sono ancora nuovo nel framework delle entità e sto ancora immergendomi nelle migliori pratiche, quindi se hai suggerimenti per rendere questa risposta più eloquente per i futuri utenti apprezzerei l'assistenza.
Pynt,

4
Non avevo riflettuto molto sul motivo esatto quando ho commentato, ma certamente le convenzioni di denominazione hanno danneggiato la leggibilità (ovviamente copiata dall'OP). Inoltre, le virgole all'inizio della riga danneggiano molto la leggibilità (soggettiva, per me) e gli spazi bianchi / rientro potrebbero essere leggermente migliorati. Ho inviato una modifica con tutti questi miglioramenti (IMHO) da quando l'hai richiesta.
Dan Bechard,

2
La formattazione del codice è spesso distorta, ma ci sono cose generali che la maggior parte delle persone concorda sul fatto che sembrano migliori. Per quanto riguarda le convenzioni di denominazione, ero solito chiamare cose davvero nomi abbreviati, ma ora posso digitare abbastanza velocemente (senza nemmeno considerare cose come Intellisense) che i pochi caratteri salvati non valgono il danno in leggibilità rispetto a nominare cose verbalmente ad es. "EntryID" vs. "EID", "CombinatoEntry" vs. "cm", ecc. Alla fine, qualcun altro leggerà il mio codice, e preferirei che non sviluppassero odio per me come una funzione lineare del numero di righe del mio codice che hanno dovuto leggere / mantenere.
Dan Bechard,

5
Semplicemente non capisco gli argomenti contro le virgole. Sono fermamente convinto, in quanto rende molto semplice commentare singole clausole / argomenti. E sembra più bello :-)
Auspex
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.