Как сделать левые внешние соединения с DbLinq и SQLite?
Я старался
db.Table1.GroupJoin(db.Table2,
t1 => t1.Id,
t2 => t2.t1Id,
(t1,g) => new { t1, g })
.Where(item => !item.g.Any())
.Select(item => item.t1);
Но он вернул 0 результатов. Я пытаюсь написать что-то, что сгенерировало следующий код SQL (или что-то подобное)
SELECT t1.*
FROM Table1 as t1
LEFT OUTER JOIN Table2 as t2
ON t1.Id = t2.t1Id
WHERE IsNull(t2.Id);
1 ответ
Решение
Похоже, ваш желаемый результат состоит в том, чтобы идентифицировать элементы из Table1
которые не имели результатов во время левого внешнего соединения с Table2
,
В беглой нотации подход будет похож на это:
var query = db.Table1.GroupJoin(db.Table2,
t1 => t1.Id,
t2 => t2.t1Id,
(t1, joined) => new { t1, joined }
)
.SelectMany(r => r.joined.DefaultIfEmpty(), (r, j) => new
{
r.t1,
j
})
.Where(r => r.j == null)
.Select(r => r.t1);
В синтаксисе запроса:
var query = from t1 in db.Table1
join t2 in db.Table2 on t1.Id equals t2.t1Id into joined
from j in joined.DefaultIfEmpty()
where j == null
select t1;