Eu tenho o seguinte SQL, que estou tentando traduzir para LINQ:
SELECT f.value
FROM period as p
LEFT OUTER JOIN facts AS f ON p.id = f.periodid AND f.otherid = 17
WHERE p.companyid = 100
Vi a implementação típica da junção externa esquerda (por exemplo, into x from y in x.DefaultIfEmpty()
etc.), mas não tenho certeza de como introduzir a outra condição de junção ( AND f.otherid = 17
)
EDITAR
Por que a AND f.otherid = 17
condição faz parte do JOIN em vez da cláusula WHERE? Porque f
pode não existir para algumas linhas e eu ainda quero que essas linhas sejam incluídas. Se a condição for aplicada na cláusula WHERE, após a junção - então não recebo o comportamento que desejo.
Infelizmente isso:
from p in context.Periods
join f in context.Facts on p.id equals f.periodid into fg
from fgi in fg.DefaultIfEmpty()
where p.companyid == 100 && fgi.otherid == 17
select f.value
parece ser equivalente a isso:
SELECT f.value
FROM period as p
LEFT OUTER JOIN facts AS f ON p.id = f.periodid
WHERE p.companyid = 100 AND f.otherid = 17
o que não é exatamente o que estou procurando.
c#
sql
linq
linq-to-sql
outer-join
dan
fonte
fonte
Respostas:
Você precisa apresentar sua condição de associação antes de ligar
DefaultIfEmpty()
. Eu usaria apenas a sintaxe do método de extensão:Ou você pode usar uma subconsulta:
fonte
isso funciona também, ... se você tiver várias junções de coluna
fonte
Eu sei que é " um pouco tarde ", mas se alguém precisar fazer isso na sintaxe do método LINQ ( e foi por isso que encontrei este post inicialmente ), seria assim:
fonte
.Select(fact.Value)
deveria ser.Select(f => f.Value)
Outra opção válida é espalhar as junções entre várias cláusulas LINQ , da seguinte maneira:
fonte
Pode ser gravado usando a chave de junção composta. Além disso, se houver necessidade de selecionar propriedades dos lados esquerdo e direito, o LINQ poderá ser gravado como
fonte
Parece-me que vale a pena considerar algumas reescritas no seu código SQL antes de tentar traduzi-lo.
Pessoalmente, eu escreveria uma consulta como uma união (embora evite nulos inteiramente!):
Acho que concordo com o espírito da resposta do @ MAbraham1 (embora o código deles pareça não ter relação com a pergunta).
No entanto, parece que a consulta foi projetada expressamente para produzir um único resultado de coluna que compreende linhas duplicadas - na verdade, nulos duplicados! É difícil não chegar à conclusão de que essa abordagem é falha.
fonte