2011-07-08 34 views
3

代码:DefaultIfEmpty()在LINQ to SQL加入导致重复

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

基本上,我想选择每批货物一排,我要选择的对象“荚”,这应该是一个集合的PODs。这是有效的,但是我得到每一个POD的一行 - 所以如果我有一个寄售货物的3个POD,那么这个货物将返回3行。我是否错误地选择了POD?如果我拿走DefaultIfEmpty(),它奇怪地工作正常,不会导致重复。

回答

4

您使用的是第二from条款,这是有效地压扁的事情 - 但你在你的select使用pg仍然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() 
    ... 
} 

...但后者会给你一个结果与PODs一个空条目时有间没有” t任何POD,这可能不是你以前的样子。

+0

奇妙的是,第二个应该没问题 - 只要我选择一行,我可以检查空条目 – Chris

+0

@Chris:为什么检查空条目而不是检查集合是否为空? –