代码:
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(),它奇怪地工作正常并且不会导致重复。
答案 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
中为您提供一个带有单个空条目的结果,这可能不是您所追求的。