В основном я делаю запрос типа отчета, где я агрегирую данные из нескольких таблиц и оставляю их присоединенными к одной таблице.Linq to SQL: Левое соединение сгруппированным набором делает Cross Apply/Outer Apply
это выглядит как это:
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
в другом запросе, и я получаю то же самое.
Что мне не хватает?
Вы не получаете результаты, которые вы хотите? «CROSS APPLY» может показаться сумасшедшим, но по моему опыту LINQ to SQL часто умнее, чем я с SQL, и я просто позволяю ему делать это ... если результаты верны. – shaunmartin
Результаты никогда не возвращаются ... 'OUTER APPLY' в основном заставляет меня по группам задавать функцию таблицы для каждой строки' DB.People'. Запрос истекает. –