Linq to SQL: соединение слева в сгруппированный набор приводит к перекрестному применению / внешнему применению - PullRequest
5 голосов
/ 09 марта 2011

Обычно я делаю запрос типа отчета, в котором я собираю данные из нескольких таблиц и оставляю их в одной таблице.

это выглядит примерно так:

var docs = from x in DB.Docs
           group x by x.PersonId into g
           select new { 
                g.Key, 
                totalSent = g.Sum(x => x.SentDate.HasValue ? 1 : 0),
                lastSent = g.Max(x => x.SentDate)
                ...
           };

var summary = from x in DB.People
              from y in docs.Where(y => y.Key == x.Id).DefaultIfEmpty()
              select new {
                   x.Id,
                   x.Name,
                   y.totalSent,
                   y.lastSent
              }

Я бы ожидал, что этот созданный sql, который остался, соединил DB.People с результатами docs, но вместо этого я получил некоторые сумасшедшие вещи CROSS APPLY(( SELECT NULL AS [EMPTY]) as [t1] OUTER APPLY ....

Я пробовал каждый вариант синтаксиса левого соединения, который я могу себе представить, я даже обернул docs в другой запрос, и я получил то же самое.

Чего мне не хватает?

1 Ответ

0 голосов
/ 10 марта 2011
from x in DB.People
from y in docs.Where(y => y.Key == x.Id).DefaultIfEmpty() 

Вышеприведенные данные явно дадут декартовы результаты, которые позже будут отфильтрованы.

Возможно, вы хотели присоединиться:

from x in DB.People
join y2 in docs on x.Id equals y2.Key into g
from y in g.DefaultIfEmpty() 

Как насчет этого:

from x in DB.People
let g = x.Docs
select new
{
  x.Id,
  x.Name,
  totalSent = g.Sum(y => y.SentDate.HasValue ? 1 : 0),
  lastSent = g.Max(y => y.SentDate)
}
...