У меня есть следующий SQL, который я пытаюсь перевести на 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
Я видел типичную реализацию левого внешнего соединения (т. Е. И т. into x from y in x.DefaultIfEmpty()
Д.), Но не уверен, как ввести другое условие соединения ( AND f.otherid = 17
)
РЕДАКТИРОВАТЬ
Почему AND f.otherid = 17
условие является частью JOIN, а не предложением WHERE? Потому что f
может не существовать для некоторых строк, и я все еще хочу, чтобы эти строки были включены. Если условие применяется в предложении WHERE, после JOIN - тогда я не получаю нужное мне поведение.
К сожалению это:
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
кажется эквивалентным этому:
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
что не совсем то, что я после.
Ответы:
Вам необходимо ввести ваше условие присоединения перед звонком
DefaultIfEmpty()
. Я бы просто использовал синтаксис метода расширения:Или вы можете использовать подзапрос:
источник
это тоже работает, ... если у вас есть несколько объединений столбцов
источник
Я знаю, что это " немного поздно ", но на всякий случай, если кому-то нужно сделать это в синтаксисе метода LINQ ( именно поэтому я и нашел этот пост изначально ), это было бы следующим образом:
источник
.Select(fact.Value)
должно быть.Select(f => f.Value)
Другим допустимым вариантом является распределение объединений по нескольким предложениям LINQ следующим образом:
источник
Может быть написано с использованием составного ключа соединения. Также, если необходимо выбрать свойства как слева, так и справа, LINQ можно записать как
источник
Мне кажется, есть смысл подумать о некоторых переписываниях вашего кода SQL, прежде чем пытаться перевести его.
Лично я бы написал такой запрос как объединение (хотя я бы полностью избегал нулей!):
Поэтому я думаю, что согласен с духом ответа @ MAbraham1 (хотя их код, похоже, не имеет отношения к вопросу).
Тем не менее, кажется, что запрос специально разработан для получения результата в одном столбце, содержащем дублирующиеся строки - действительно дублирующиеся нули! Трудно не прийти к выводу, что этот подход несовершенен.
источник