Czy to zapytanie jest równoważne LEFT OUTER
złączeniu?
//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
źródło
źródło
Nie potrzebujesz instrukcji into:
I tak, powyższe zapytanie rzeczywiście tworzy lewe sprzężenie zewnętrzne.
Link do podobnego pytania, które obsługuje wiele złączeń po lewej stronie: Linq do Sql: Wiele złączeń zewnętrznych po lewej stronie
źródło
Sprawdź http://msdn.microsoft.com/en-us/vbasic/bb737929.aspx
źródło
Znalazłem 1 rozwiązanie. jeśli chcesz przetłumaczyć ten rodzaj SQL (lewe sprzężenie) na Linq Entity ...
SQL:
LINQ:
źródło
DefaultIfEmpty
.Chciałbym dodać jeszcze jedną rzecz. W LINQ to SQL, jeśli twoja baza danych jest poprawnie zbudowana, a tabele są powiązane za pomocą ograniczeń klucza obcego, nie musisz w ogóle wykonywać sprzężenia.
Za pomocą LINQPad utworzyłem następujące zapytanie LINQ:
Który został przetłumaczony na (lekko obcięte) zapytanie poniżej
Zwróć uwagę na
LEFT OUTER JOIN
powyższe.źródło
Zadbaj o wydajność:
Doświadczyłem, że przynajmniej w przypadku EF Core różne odpowiedzi podane tutaj mogą skutkować inną wydajnością. Zdaję sobie sprawę, że OP pytał o Linq do SQL, ale wydaje mi się, że te same pytania pojawiają się również z EF Core.
W konkretnym przypadku, z którym miałem do czynienia, (ładniejsza składniowo) sugestia Marca Gravella spowodowała, że lewe łączenia wewnątrz krzyża zostały zastosowane - podobnie do tego, co opisał Mike U - co skutkowało tym, że szacunkowe koszty tego konkretnego zapytania wyniosły dwa razy wyższy w porównaniu z zapytaniem bez połączeń krzyżowych . Czasy wykonania serwera różniły się 3- krotnie . [1]
Rozwiązanie autorstwa Marca Gravella spowodowało zapytanie bez łączeń krzyżowych.
Kontekst: Zasadniczo potrzebowałem wykonać dwa łączenia po lewej stronie na dwóch stołach, z których każdy ponownie wymagał połączenia z innym stołem. Ponadto musiałem określić inne warunki gdzie-w tabelach, na których musiałem zastosować lewe sprzężenie. Ponadto miałem dwa wewnętrzne łączenia na głównym stole.
Szacunkowe koszty operatora:
Czasy wykonania serwera w ms (zapytania wykonywane 10 razy; mierzone za pomocą funkcji SET STATISTICS TIME ON):
(Pierwsze uruchomienie było wolniejsze dla obu zapytań; wydaje się, że coś jest w pamięci podręcznej).
Rozmiary stołów:
Wersja EF Core: 2.2.1.
Wersja SQL Server: MS SQL Server 2017-14 ... (w systemie Windows 10).
Wszystkie odpowiednie tabele miały indeksy tylko dla kluczy podstawowych.
Mój wniosek: zawsze zaleca się przyjrzenie się wygenerowanemu kodowi SQL, ponieważ może się naprawdę różnić.
[1] Co ciekawe, ustawiając „Statystyki klienta” w MS SQL Server Management Studio na, zauważyłem odwrotny trend; mianowicie, że ostatnie uruchomienie rozwiązania bez zastosowania krzyżyka zajęło więcej niż 1 s. Przypuszczam, że coś tu było nie tak - może z moją konfiguracją.
źródło