Mam następujący kod SQL, który próbuję przetłumaczyć na 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
Widziałem typową implementację lewego sprzężenia zewnętrznego (tj. into x from y in x.DefaultIfEmpty()
Itd . ), Ale nie jestem pewien, jak wprowadzić inny warunek sprzężenia ( AND f.otherid = 17
)
EDYTOWAĆ
Dlaczego AND f.otherid = 17
warunek jest częścią JOIN zamiast w klauzuli WHERE? Ponieważ f
może nie istnieć dla niektórych wierszy i nadal chcę, aby te wiersze były uwzględnione. Jeśli warunek zostanie zastosowany w klauzuli WHERE, po JOIN - wtedy nie otrzymam takiego zachowania.
Niestety to:
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
wydaje się być równoważne z tym:
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
co nie jest tym, czego szukam.
c#
sql
linq
linq-to-sql
outer-join
dan
źródło
źródło
Odpowiedzi:
Zanim zadzwonisz, musisz podać swój warunek dołączenia
DefaultIfEmpty()
. Po prostu użyłbym składni metody rozszerzenia:Lub możesz użyć podzapytania:
źródło
to też działa, ... jeśli masz wiele złączeń kolumn
źródło
Wiem, że jest " trochę późno ", ale na wszelki wypadek, gdyby ktoś musiał to zrobić w składni metody LINQ ( dlatego początkowo znalazłem ten post ), oto jak to zrobić:
źródło
.Select(fact.Value)
powinno być.Select(f => f.Value)
Inną prawidłową opcją jest rozłożenie sprzężeń na wiele klauzul LINQ w następujący sposób:
źródło
Można zapisać przy użyciu złożonego klucza złączenia. Ponadto jeśli istnieje potrzeba wybrania właściwości z lewej i prawej strony, LINQ można zapisać jako
źródło
Wydaje mi się, że rozważenie kilku zmian w kodzie SQL przed próbą przetłumaczenia ma wartość.
Osobiście napisałbym takie zapytanie jako sumę (chociaż całkowicie unikałbym wartości null!):
Więc myślę, że zgadzam się z duchem odpowiedzi @ MAbraham1 (choć ich kod wydaje się nie mieć związku z pytaniem).
Wygląda jednak na to, że kwerenda została specjalnie zaprojektowana w celu uzyskania wyniku w jednej kolumnie zawierającego zduplikowane wiersze - w rzeczywistości zduplikowane wartości null! Trudno nie dojść do wniosku, że to podejście jest błędne.
źródło