У меня есть запрос SQL, который я преобразовываю в Linq, и я хочу использовать левое соединение вместо внутреннего соединения.
Я пробовал метод DefaultIfEmpty (), но мне не повезло.
Запрос Sql:
SELECT t0.*, t1.* FROM entity AS t0
LEFT JOIN migration_logs AS t1 ON (CAST(t0.id AS CHAR) = t1.ObjectId and 'SASParty' = t1.ObjectType)
where t1.status is null || t1.Status <> '1' ORDER BY t0.id LIMIT 0, 10;
Запрос Linq:
Entities
.Join(Migration_logs,
e => new { id = e.Id.ToString(), ObjectType = "SASParty" },
mlog => new { id = mlog.ObjectId, mlog.ObjectType },
(e, mlog) => new {e,mlog})
.Where(result => result.mlog.Status == null || result.mlog.Status != "1").DefaultIfEmpty().ToList()
Я использую linqpad, и когда я выполняю запрос linq, он генерирует следующий SQL-запрос:
SELECT t0.*
FROM entity AS t0
INNER JOIN migration_logs AS t1
ON ((CAST(t0.id AS CHAR) = t1.ObjectId) AND (@p0 = t1.ObjectType))
WHERE ((t1.Status IS NULL) OR (t1.Status <> @p1))
Существуют некоторые незначительные различия в исходном запросе и сгенерированном SQL-запросе, но я надеюсь, что формулировка проблемы ясна.
Буду признателен за любую помощь.