Linq для лиц - Как определить левое соединение для группировки? - PullRequest
0 голосов
/ 04 марта 2010

У нас есть две таблицы - Tasks и TasksUsers (пользователи, назначенные для задачи). Задача имеет коллекцию EntityCollection, которая называется TaskUsers.

Этот запрос возвращает количество задач на имя пользователя:

model.TaskCountByAssignee =
            (
            from t in TaskRepository.List()
            from tu in t.TaskUsers
            group tu by tu into tug
                select new {Count = tug.Count(), UserName = tug.Key.Username}).ToList()

Этот запрос возвращает:

Администратор 11
LukLed 5

Я хочу, чтобы он вернулся:

Администратор 11
LukLed 5
ноль 10

У некоторых задач нет назначений, но я все еще хочу их в своем наборе результатов. Обычно в SQL это достигается изменением join на left join. В Linq, вне EF, я мог бы использовать DefaultIfEmpty (). Как это можно сделать в linq для сущностей?

Ответы [ 2 ]

2 голосов
/ 04 марта 2010

Моя первая попытка будет:

model.TaskCountByAssignee = (
        (from t in TaskRepository.List()
         from tu in t.TaskUsers
         group tu by tu.UserName into tug
         select new {Count = tug.Count(), UserName = tug.Key})
        .Union(from t in TaskRepository.List()
               where !t.TaskUsers.Any()
               group t by 1 into tug
               select new {Count = tug.Count(), UserName = null}).ToList();

Или что-то в этом роде.Или просто используйте два запроса.Я не знаю, если это лучший способ, хотя.Как я отмечал в комментариях, в EF 4 это далеко проще.

0 голосов
/ 04 марта 2010

Я бы предложил посмотреть здесь, который проходит через левые внешние соединения с EF:

http://geekswithblogs.net/SudheersBlog/archive/2009/06/11/132758.aspx

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