Estou tentando implementar uma consulta em LINQ que usa uma junção externa esquerda com várias condições na cláusula ON.
Usarei o exemplo das duas tabelas a seguir, Project (ProjectID, ProjectName) e Task (TaskID, ProjectID, TaskName, Completed). Quero ver a lista completa de todos os projetos com suas respectivas tarefas, mas apenas as tarefas que foram concluídas.
Não posso usar um filtro para Completed == true
porque isso filtrará quaisquer projetos que não tenham tarefas concluídas. Em vez disso, desejo adicionar Completed == true
à cláusula ON da junção para que a lista completa de projetos seja mostrada, mas apenas as tarefas concluídas sejam mostradas. Projetos sem tarefas concluídas mostrarão uma única linha com um valor nulo para Tarefa.
Aqui está a base da consulta.
from t1 in Projects
join t2 in Tasks
on new { t1.ProjectID} equals new { t2.ProjectID } into j1
from j2 in j1.DefaultIfEmpty()
select new { t1.ProjectName, t2.TaskName }
Como faço && t2.Completed == true
para adicionar à cláusula on?
Não consigo encontrar nenhuma documentação do LINQ sobre como fazer isso.
Respostas:
Você só precisa nomear a propriedade anônima da mesma forma em ambos os lados
Com base nos comentários de @svick, aqui está outra implementação que pode fazer mais sentido:
fonte
and
, e não uma igualdade de algum objeto “estranho”. E para provar meu ponto, seu código está errado. Para funcionar, você teria que tertrue
do lado esquerdo e do ladot2.Complete
direito.AND SecondProperty IN (123, 456)
. Vou passar para esse desafio e qualquer ajuda que você possa dar seria muito apreciada.Aqui está:
fonte
Você não pode fazer assim. A
join
cláusula (e oJoin()
método de extensão) oferece suporte apenas a equijoins. Essa também é a razão, porque usaequals
e não usa==
. E mesmo se você pudesse fazer algo assim, não funcionaria, porquejoin
é uma junção interna, não externa.fonte
Isso funciona bem para 2 tabelas. Tenho 3 tabelas e a cláusula on tem de vincular 2 condições de 3 tabelas. Meu código:
de p em _dbContext.Products juntar pv em _dbContext.ProductVariants em p.ProduktId é igual a pv.ProduktId juntar jpr em leftJoinQuery em novo {VariantId = pv.Vid, ProductId = p.ProduktId} é igual a novo {VariantId = jpr.Prices.Variant ProductId = jpr.Prices.ProduktID} em lj
Mas está mostrando um erro neste ponto: junte pv em _dbContext.ProductVariants em p.ProduktId é igual a pv.ProduktId
Erro: o tipo de uma das expressões na cláusula de junção está incorreto. A inferência de tipo falhou na chamada para 'GroupJoin'.
fonte