2011-09-19 55 views
1

我有這個疑問EF4層疊左外連接空異常

Select p.Name,p.Street from person p 
left join address a on a.address_id = p.address_id 
left join Order o on o.order_id = a.order_id 

但是當我試圖把它轉換成LINQ查詢,

var q = from p in Entities.Person 
     from a in Entities.Address.Where(a=>a.address_id == p.address_id).DefaultIfEmpty() 
     from o in Entities.Order.Where (o=>o.order_id== a.order_Id).DefaultIfEmpty() 

我得到一個空的例外,因爲對於一些組合address_ids沒有地址,它在o => o.order_id == a.order_Id子句中爆炸(因爲a爲null)。

請讓我知道如何做EF 4中的多個左連接,正確的方法!

謝謝!

回答

0

如果您已經正確建模,則不需要顯式執行左外連接。

Select p.Name, a.Street from person p 
left join address a on a.address_id = p.address_id 
left join Order o on o.order_id = a.order_id 

上述查詢可以如下

var projection = Entities.Person.Select(p => new {p.Name, p.Address.Street}); 

EF將自動添加加入檢索的字段被轉換。

您可以手動完成的加入如下

var projection = from p in Entities.Person 
     join a in Entities.Address on p.address_id equals a.address_id into outer 
     from a in outer.DefaultIfEmpty() 
     select new {p.Name, a.Street}; 
+0

謝謝!那麼你是說沒有辦法編碼我爲了實現這個目標而做的方式嗎?Bcos你可以看到我需要用地址表和Order table進行左連接。 – user636525

+0

@ user636525添加了一個手動執行外部聯接的示例。它需要更多擊鍵才能達到同樣的效果! – Eranga