Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá, tenho tabelas nesta estrutura
----tb_customer----
id_customer
----tb_history----
id_history
id_customer
id_typehistory
----tb_typehistory----
id_typehistory
Meu objeto principal é tb_customer.
Obrigado.
Obrigado Roberto, mas tenho um problema que é em relação ao join.
tb_history pode não ter dados de tb_typehistory
tb_history pode não ter dados de tb_customer
O correto seria um left join, mas já tentei e não consigo fazer funcionar um left join desta maneira. Por isso estava tentando Load, que aliás estava funcionando até relacionar com tb_typehistory.
Então a tabela principal é a history, ai você coloca o left na typehistory e na customer
Sim, da maneira que é lida a estrutura o seu comentário está correto.
Mas vou explicar como estou fazendo.
Estou criando uma lista do tipo tb_customer, após isso eu carrego tb_history e deveria também carregar tb_typehistory, para ser usado em outro momento.
Então fica complicado fazer isso, porque você quer pegar o id da tabela customer que não existe para comparar com a tabela history
não esqueça do relacionamento entre as tabelas, na verdade, a importância de uma modelagem de dados bem definida até os mínimos detalhes, como os campos de relacionamentos, um velho ditado diz, que um relacionamento bem definido é a alma do aplicativo, pois daí saem todas as consultas e operações com o banco, influenciando diretamente na otimização e performance do aplicativo
Ok, entendo. Mas pra finalizar você poderia me mostrar como seria um left join entre estas estruturas? Obrigado.
select a.id_customer, a.id_history, a.id_typehistory from tb_history a
left join tb_customer b on a.id_customer = b.id_customer
left join tb_typehistory c on a.id_typehistory = c.id_typehistory;
Eu faria desta forma.
Diferenças entre LEFT, RIGHT e INNER
Quando dizemos que a tabela será Left ou Right, estamos informando ao comando SQL que ele deve obedecer o sentido para a Direita ou para a Esquerda, ou seja, ao utilizarmos Left Join o banco de dados irá analisar a estrutura da tabela da Direita e comparar com a tabela da Esquerda (leia-se Direita para a Esquerda), veja o desenho.
/applications/core/interface/imageproxy/imageproxy.php?img=http://prosige.com.br/portal/images/artigos/joins.jpg&key=8356e00255d944b432a467eace7d799bdc4d031228ee56dc57d075cc3fab6250" width="360" alt="joins.jpg" />
Left Join
Na primeira situação temos o Left Join, a seta está apontando para a tabela FUNCIONARIOS simbolizando que a precedência é da tabela da Esquerda, então podemos dizer que no select abaixo, serão listados todos os Funcionários, mesmo aqueles que não tem Filial cadastrada.
**SELECT** A.FUN_NOME, B.FIL_NOME **FROM** FUNCIONARIOS A-- RESULTADO DA CONSULTA --
FUN_NOME FIL_NOME
JOÃO MATRIZ
JOAQUIM FILIAL 1
JOSÉ FILIAL 1
MÁRCIO FILIAL 2
PEDRO null
Repare que Pedro foi incluído no resultado, porém ele não possui uma Filial associada em seu cadastro. Este tipo de Join é o mais utilizado quando não se tem certeza que todos os registros possuem ligação entre as tabelas e também na maioria das vezes por questões de desempenho.
Right Join
Na segunda situação foi utilizado o Right Join, também conhecido apenas por Join, que aponta para a tabela FILIAL simbolizando a precedência da tabela da Direita, logo, concluímos que os dados da tabela Filial devem existir para que o registro seja trazido no Select.
**SELECT** A.FUN_NOME, B.FIL_NOME **FROM** FUNCIONARIOS A-- RESULTADO DA CONSULTA --
FUN_NOME FIL_NOME
JOÃO MATRIZ
JOAQUIM FILIAL 1
JOSÉ FILIAL 1
MÁRCIO FILIAL 2
Note que o funcionário Pedro desta vez não foi incluído na lista de resultados, isto ocorreu porque esta consulta traz apenas registros onde existe um cadastro de Filial para o Funcionário.
Inner Join
Temos ainda a situação do Inner Join que nada mais faz do que observar se existem registros combinados em ambas as tabelas, ou seja, para que um registro seja incluído na lista de resultados, o campo de ligação entre duas tabelas deve satisfazer as condições em ambas. O resultado desta consulta seria algo muito semelhante ao Join.
Obrigado caras pela atenção.
Sobre a questão dos tipos de relacionamentos, eu entendo sim como tudo funciona, mas a dúvida sempre foi em relação ao método Load do EntityFramework e/ou como relacionar como left join através do recurso Linq to SQL (que havia comentado que não estava conseguindo fazer funcionar).
select a.id_customer, b.id_history, c.id_typehistory from tb_customer a
inner join tb_history b on a.id_customer = b.id_customer
inner join tb_typehistory c on b.id_typehistory = c.id_typehistory;
A relação dessas tabelas ficaria desta forma.