LINQ Присоединиться к нескольким условиям в разделе On
Я пытаюсь реализовать запрос в LINQ, который использует левое внешнее соединение с несколькими условиями в предложении ON.
Я буду использовать пример следующих двух таблиц Project (ProjectID, ProjectName) и Task (TaskID, ProjectID, TaskName, Completed). Я хочу увидеть полный список всех проектов с их соответствующими задачами, но только те задачи, которые были завершены.
Я не могу использовать фильтр для Completed == true
, потому что он будет отфильтровывать любые проекты, которые не имеют завершенных задач. Вместо этого я хочу добавить Completed == true
в предложение ON соединения, чтобы был показан полный список проектов, но будут показаны только завершенные задания. Проекты без завершенных задач покажут одну строку с нулевым значением для задачи.
Вот основа запроса.
from t1 in Projects
join t2 in Tasks
on new { t1.ProjectID} equals new { t2.ProjectID } into j1
from j2 in j1.DefaultIfEmpty()
select new { t1.ProjectName, t2.TaskName }
Как добавить && t2.Completed == true
в предложение on?
Я не могу найти какую-либо документацию LINQ о том, как это сделать.
Ответы
Ответ 1
Вам просто нужно назвать анонимное свойство одинаковым с обеих сторон
on new { t1.ProjectID, SecondProperty = true } equals
new { t2.ProjectID, SecondProperty = t2.Completed } into j1
Основываясь на комментариях @svick, вот еще одна реализация, которая может иметь смысл:
from t1 in Projects
from t2 in Tasks.Where(x => t1.ProjectID == x.ProjectID && x.Completed == true)
.DefaultIfEmpty()
select new { t1.ProjectName, t2.TaskName }
Ответ 2
Здесь вы можете:
from b in _dbContext.Burden
join bl in _dbContext.BurdenLookups on
new { Organization_Type = b.Organization_Type_ID, Cost_Type = b.Cost_Type_ID } equals
new { Organization_Type = bl.Organization_Type_ID, Cost_Type = bl.Cost_Type_ID }
Ответ 3
Вы не можете так сделать. Предложение join
(и метод расширения Join()
) поддерживает только equijoins. Это также причина, почему она использует equals
, а не ==
. И даже если вы можете сделать что-то подобное, это не сработает, потому что join
является внутренним соединением, а не внешним соединением.