LINQ Join с несколькими условиями в предложении - PullRequest
77 голосов
/ 05 октября 2011

Я пытаюсь реализовать запрос в LINQ, который использует левое внешнее соединение с несколькими условиями в предложении ON.

Я буду использовать пример следующих двух таблиц Проект (ProjectID, ProjectName) и Task (TaskID, ProjectID, TaskName, Завершено).Я хочу видеть полный список всех проектов с соответствующими задачами, но только те задачи, которые выполнены.

Я не могу использовать фильтр для 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 о том, как это сделать.

Ответы [ 3 ]

109 голосов
/ 05 октября 2011

Вам просто нужно назвать анонимное свойство одинаковым с обеих сторон

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 }
31 голосов
/ 04 июня 2013

Здесь вы идете с:

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 }
1 голос
/ 05 октября 2011

Вы не можете так делать.Предложение join (и метод расширения Join()) поддерживает только эквиойны.Это также причина, почему он использует equals, а не ==.И даже если бы вы могли сделать что-то подобное, это не сработало бы, потому что join - это внутреннее соединение, а не внешнее соединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...