Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq to sql Linq to SQL:左连接分组集会产生交叉应用/外部应用_Linq To Sql_C# 4.0_Group By_Left Join - Fatal编程技术网

Linq to sql Linq to SQL:左连接分组集会产生交叉应用/外部应用

Linq to sql Linq to SQL:左连接分组集会产生交叉应用/外部应用,linq-to-sql,c#-4.0,group-by,left-join,Linq To Sql,C# 4.0,Group By,Left Join,基本上,我是在做一个报表类型的查询,在这个查询中,我聚合了来自多个表的数据,并将其连接到一个表中 看起来有点像这样: 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),

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

看起来有点像这样:

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
的结果中,但是我得到了一些疯狂的
交叉应用((选择NULL作为[EMPTY])作为[t1]外部应用…
东西

我尝试了我所能想到的左连接语法的每一种变体,我甚至在另一个查询中包装了
docs
,得到了同样的结果

我错过了什么

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)
}

你没有得到你想要的结果吗?
交叉应用
可能看起来很疯狂,但根据我的经验,LINQ to SQL通常比我使用SQL更聪明,我只是让它做它自己的事情……如果结果是正确的。结果永远不会回来……
外部应用
基本上让我的by GROUBLED set为
数据库的每一行都设置一个表值函数。人
。查询超时。我的版本是一个快捷方式,如果
文档
不表示分组集,它将创建一个左联接。因此,使用我的方法可以得到相同的sql?是的,两种方法都可以得到相同的sql。第二个示例很不幸无法工作,因为它们是在某种笨拙的数据库架构上构建的POCO对象具有直接L2S映射的体系结构,我没有时间更改它。例如,Docs表示对3个表的一个相当有趣的查询。