Tabelas de junção 3 da estrutura de entidades


133

Estou tentando juntar três tabelas, mas não consigo entender o método ...

Eu completei juntar 2 tabelas

        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

Gostaria de incluir a tabela tbl_Title com o TID PK e obter o campo Title .

Muito obrigado


Confira este artigo relacionado. Não está usando a notação Method, mas você deve ser capaz de obter a essência ... stackoverflow.com/questions/11204367/…
xspydr

Por favor, mostre uma imagem com propriedades de navegação expandidas. As propriedades de navegação são junções prontas.
Gert Arnold

Respostas:


202

Eu acho que será mais fácil usar a consulta baseada em sintaxe:

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 você provavelmente deve adicionar uma orderbycláusula para garantir que os Top(10)retornos estejam corretos entre os dez principais itens.


3
Muito obrigado pelo método; funciona claro, mas eu gostaria de ver a resposta como pedi, muito obrigado novamente.
Erçin Dedeoğlu

@ MarcinJuraszek: se eu precisar de um ViewModel para funcionar, é necessário que eu entre nas tabelas?
Vini

Isso não funciona mesmo sem assíncrono. Eu tenho o cenário exato, mas a consulta lança uma exceção [the_list_of_all_return_variables] 'não pode ser serializada. @marcinJuraszek - Você poderia dar uma olhada no stackoverflow.com/questions/42453123/…
sandiejat 25/17/17

1
PERFEITO! você me salvou tanto tempo :)
MohammadHossein R

81

Isso não foi testado, mas acredito que a sintaxe deve funcionar para uma consulta lambda. À medida que você junta mais tabelas a essa sintaxe, é necessário aprofundar os novos objetos para alcançar os valores que deseja 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
Isso é horrível. Se algum dia eu encontrasse essa consulta no código de produção, eu a refatoraria imediatamente. 1 para responder à pergunta, conforme solicitado!
precisa

8
@ Dan Por curiosidade, é apenas o não pensado em todas as convenções de nomenclatura com c, cm e ccm, ou simplesmente a sintaxe necessária para executar as junções usando linq e lambda que é hediondo? Se o primeiro, e você gostaria de editar a postagem para ter um layout melhor, tenha em todos os aspectos. Ainda sou novo na estrutura da entidade e ainda estou absorvendo as práticas recomendadas. Se você tiver sugestões para tornar essa resposta mais eloquente para futuros usuários, agradeceria a assistência.
Pynt

4
Eu não tinha pensado muito no motivo exato quando comentei, mas certamente as convenções de nomenclatura prejudicam a legibilidade (obv. Copiadas do OP). Além disso, as vírgulas no início da linha prejudicam bastante a legibilidade (subjetiva, para mim), e o espaço em branco / indentação pode ser ligeiramente melhorado. Enviei uma edição com todas essas melhorias (IMHO) desde que você solicitou.
precisa

2
A formatação de código geralmente é tendenciosa, mas há coisas gerais que a maioria das pessoas concorda que parecem melhores. Quanto às convenções de nomenclatura, eu costumava chamar as coisas de nomes muito curtos, mas agora posso digitar bastante rápido agora (nem mesmo considerando coisas como o Intellisense) para que os poucos caracteres salvos não valham o prejuízo na legibilidade em comparação com a nomeação verbal das coisas, por exemplo, "EntryID" vs. "EID", "combinadoEntry" vs. "cm" etc. etc. Eventualmente, outra pessoa lerá meu código, e eu prefiro que eles não cresçam ódio por mim como uma função linear do número de linhas do meu código que eles tiveram que ler / manter.
precisa

5
Eu simplesmente não entendo os argumentos contra as linhas de partida de vírgulas. Acredito firmemente, pois torna muito fácil comentar cláusulas / argumentos individuais. E parece mais bonito :-)
Auspex
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.