Linq to SQL:左转接分组集合可生成交叉应用/外部应用

Linq to SQL : Left joining a grouped set makes a Cross Apply/Outer Apply

提问人:Master Morality 提问时间:3/10/2011 更新时间:3/10/2011 访问量:1451

问:

基本上,我正在做一个报告类型的查询,其中我聚合了来自多个表的数据,并将其连接到一个表中。

它看起来有点像这样:

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.PeopledocsCROSS APPLY(( SELECT NULL AS [EMPTY]) as [t1] OUTER APPLY ...

我已经尝试了我能想到的左连接语法的所有变体,我什至包装了另一个查询,我得到了同样的东西。docs

我错过了什么?

LINQ-to-SQL C#-4.0 分组依据 左联接

评论

0赞 shaunmartin 3/10/2011
你没有得到你想要的结果吗? 可能看起来很疯狂,但根据我的经验,LINQ to SQL 通常比我使用 SQL 更聪明,我只是让它做它的事情......如果结果正确。CROSS APPLY

答:

0赞 Amy B 3/10/2011 #1
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)
}