Entity Framework Unir 3 tablas


133

Estoy tratando de unir tres tablas pero no puedo entender el método ...

Completé unir 2 tablas

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

mesas

Me gustaría incluir la tabla tbl_Title con TID PK y obtener el campo Título .

Muchas gracias


Mira este artículo relacionado. No está usando la notación Método, pero debería ser capaz de obtener la esencia ... stackoverflow.com/questions/11204367/…
xspydr

Muestre una imagen con propiedades de navegación ampliadas. Las propiedades de navegación son uniones listas para usar.
Gert Arnold

Respuestas:


202

Creo que será más fácil usar consultas basadas en sintaxis:

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

Y probablemente debería agregar una orderbycláusula, para asegurarse de que Top(10)devuelve los diez elementos correctos.


3
Muchas gracias por el método; funciona bien, pero me gustaría ver la respuesta que le pedí, muchas gracias de nuevo.
Erçin Dedeoğlu

@MarcinJuraszek: si necesito un ViewModel para trabajar, ¿es necesario que me una a las tablas?
Vini

Esto no funciona incluso sin asíncrono. Tengo el escenario exacto pero la consulta arroja una excepción [the_list_of_all_return_variables] 'no se puede serializar. @marcinJuraszek - ¿Podría echar un vistazo a stackoverflow.com/questions/42453123/…
sandiejat

1
¡PERFECTO! me ahorraste mucho tiempo :)
MohammadHossein R

81

Esto no se ha probado, pero creo que la sintaxis debería funcionar para una consulta lambda. A medida que une más tablas con esta sintaxis, debe profundizar más en los nuevos objetos para alcanzar los valores que desea manipular.

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
Eso es horrible Si alguna vez encuentro una consulta de este tipo en el código de producción, la refactorizaré de inmediato. ¡+1 por responder la pregunta tal como se hizo!
Dan Bechard el

8
@Dan Por curiosidad, ¿es simplemente no pensado en todas las convenciones de nomenclatura con c, cm y ccm, o simplemente la sintaxis requerida para realizar las uniones usando linq y lambda que es horrible? Si es lo primero, y le gustaría editar la publicación para tener un mejor diseño, tenga todos los medios. Todavía soy nuevo en el marco de la entidad y todavía estoy inmerso en las mejores prácticas, por lo que si tiene sugerencias para que esta respuesta sea más elocuente para los futuros usuarios, agradecería la ayuda.
Pynt

44
No había pensado mucho en la razón exacta cuando comenté, pero ciertamente las convenciones de nombres perjudican la legibilidad (obviamente copiada de OP). Además, las comas como el comienzo de la línea perjudicaron mucho la legibilidad (subjetiva, para mí), y el espacio en blanco / sangría podría mejorarse ligeramente. He enviado una edición con todas estas mejoras (en mi humilde opinión) desde que lo solicitó.
Dan Bechard el

2
El formato de código a menudo está sesgado, pero hay cosas generales que la mayoría de la gente acepta que se ven mejor. En cuanto a las convenciones de nomenclatura, solía llamar a las cosas nombres realmente cortos, pero ahora puedo escribir lo suficientemente rápido (sin tener en cuenta cosas como Intellisense) que los pocos caracteres guardados no valen la pena en comparación con la nomenclatura de nombres, por ejemplo, "EntryID" vs. "EID", "combineEntry" vs. "cm", etc. Eventualmente, alguien más leerá mi código, y preferiría que no crecieran el odio hacia mí como una función lineal del número de líneas de mi código que han tenido que leer / mantener.
Dan Bechard

55
Simplemente no entiendo los argumentos en contra de las líneas de inicio de comas. Soy un firme creyente, ya que hace que comentar cláusulas / argumentos individuales sea realmente fácil. Y se ve más bonito :-)
Auspex
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.