Essa consulta é equivalente a uma LEFT OUTER
associação?
//assuming that I have a parameter named 'invoiceId' of type int
from c in SupportCases
let invoice = c.Invoices.FirstOrDefault(i=> i.Id == invoiceId)
where (invoiceId == 0 || invoice != null)
select new
{
Id = c.Id
, InvoiceId = invoice == null ? 0 : invoice.Id
}
.net
database
linq
linq-to-sql
Ali Kazmi
fonte
fonte
Você não precisa das instruções into:
E sim, a consulta acima realmente cria uma junção ESQUERDA OUTER.
Link para uma pergunta semelhante que lida com várias associações à esquerda: Linq to Sql: várias associações externas à esquerda
fonte
Verifique http://msdn.microsoft.com/en-us/vbasic/bb737929.aspx
fonte
Encontrei 1 solução. se quiser traduzir esse tipo de SQL (junção esquerda) para a entidade Linq ...
SQL:
LINQ:
fonte
DefaultIfEmpty
.Eu gostaria de adicionar mais uma coisa. No LINQ to SQL, se seu banco de dados estiver construído corretamente e suas tabelas estiverem relacionadas por restrições de chave estrangeira, você não precisará fazer nenhuma associação.
Usando o LINQPad, criei a seguinte consulta LINQ:
Que foi traduzido para a consulta (ligeiramente truncada) abaixo
Observe o
LEFT OUTER JOIN
acima.fonte
Cuide do desempenho:
Eu experimentei que pelo menos com o EF Core as diferentes respostas fornecidas aqui podem resultar em desempenho diferente. Estou ciente de que o OP perguntou sobre o Linq to SQL, mas parece-me que as mesmas perguntas ocorrem também com o EF Core.
Em um caso específico que eu tive que lidar, a sugestão (sintaticamente mais agradável) de Marc Gravell resultou em junções esquerdas dentro de uma aplicação cruzada - semelhante ao que Mike U descreveu - que resultou em que os custos estimados para essa consulta específica eram dois vezes mais alto em comparação com uma consulta sem junções cruzadas . Os tempos de execução do servidor diferiram por um fator de 3 . [1]
A solução de Marc Gravell resultou em uma consulta sem junções cruzadas.
Contexto: eu basicamente precisava realizar duas junções esquerdas em duas tabelas, cada uma das quais novamente exigia uma junção a outra tabela. Além disso, lá eu tive que especificar outras condições onde nas tabelas nas quais eu precisava aplicar a junção esquerda. Além disso, eu tinha duas junções internas na mesa principal.
Custos estimados do operador:
Tempos de execução do servidor em ms (consultas executadas 10 vezes; medidas usando SET STATISTICS TIME ON):
(A primeira execução foi mais lenta nas duas consultas; parece que algo está armazenado em cache.)
Tamanhos da tabela:
Versão EF Core: 2.2.1.
Versão do SQL Server: MS SQL Server 2017 - 14 ... (no Windows 10).
Todas as tabelas relevantes tinham índices apenas nas chaves primárias.
Minha conclusão: é sempre recomendável olhar para o SQL gerado, pois ele pode realmente diferir.
[1] Curiosamente, ao definir as 'Estatísticas do cliente' no MS SQL Server Management Studio, pude ver uma tendência oposta; ou seja, a última execução da solução sem aplicação cruzada levou mais de 1s. Suponho que algo estava errado aqui - talvez com a minha configuração.
fonte