LINQ to SQL连接中的DefaultIfEmpty()导致重复

时间:2011-07-08 09:09:05

标签: c# .net linq linq-to-sql defaultifempty

代码:

var cons = from c in dc.Consignments
join p in dc.PODs ON c.ID equals p.Consignment into pg
from p in pg.DefaultIfEmpty()
...(other joins)...
select new {
...
PODs = pg
...
}

基本上,我想为每个寄售选择一行,我想选择对象'POD',它应该是POD的集合。这样可行,但是每个POD都有一行 - 所以如果我在一个货物上有3个POD,那么将为该货物返回3行。我是否错误地选择了POD?如果我拿走了DefaultIfEmpty(),它奇怪地工作正常并且不会导致重复。

1 个答案:

答案 0 :(得分:4)

您正在使用第二个from子句,这实际上会使事情变得扁平化 - 但是您在pg中使用select DefaultIfEmpty()的要点是,如果你想要一个有效的左外连接 - 你将期望每个有效组合一个结果。

我怀疑你只是想要:

var cons = from c in dc.Consignments
join p in dc.PODs ON c.ID equals p.Consignment into pg
select new {
  ...
  PODs = pg
  ...
}

可能

var cons = from c in dc.Consignments
join p in dc.PODs ON c.ID equals p.Consignment into pg
select new {
  ...
  PODs = pg.DefaultIfEmpty()
  ...
}

...但是当没有任何POD时,后者会在PODs中为您提供一个带有单个空条目的结果,这可能不是您所追求的。