Как создать левое соединение вместо внутреннего соединения? - PullRequest
1 голос
/ 17 июня 2019

У меня есть запрос 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-запросе, но я надеюсь, что формулировка проблемы ясна.

Буду признателен за любую помощь.

Ответы [ 2 ]

0 голосов
/ 18 июня 2019

вы хотите выполнить метод .DefaultIfEmpty() для количества, для которого вы хотите выполнить левое соединение.может быть, этот фрагмент кода поможет вам

from e in Entities
join ml in Migration_lpgs on new { id=e.Id.ToString(), ObjectType="SASParty" } equals new { id=ml.Id.ToString(), mlog.ObjectType } into j
from e in j.DefaultIfEmpty()
where ml.Status == null || ml.Status !=  "1"
select e
0 голосов
/ 17 июня 2019

Мне удалось найти решение с помощью запроса linq to sql и использования в предложение.

(from e in Entities
join mlog in Migration_logs
on new { id = e.Id.ToString(), ObjectType = "SASParty" }
equals new { id = mlog.ObjectId, mlog.ObjectType }
into results
 from r in results.DefaultIfEmpty()
 where r.Status == null || r.Status != "1"
 select new
 {
  e
 })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...