2010-03-27 32 views
2

通常linq對其查詢使用左外部連接,但在某些情況下,它決定使用內部連接。 我有一種情況,該決定導致錯誤的結果,因爲第二個表並不總是有合適的記錄,並從第一個表中刪除記錄。 我在一個dbml上使用linqdatasource,其中相關的表是相同的,但是一個保存從第一個中刪除的歷史記錄。兩者都有相同的主鍵。而且我正在使用數據加載選項來一次加載兩個表而無需往返。linq如何決定內部和外部連接

你能否解釋爲什麼linq決定在這裏使用內連接?

謝謝

+1

請問一些代碼? – 2010-03-27 07:41:32

回答

1

不,不幸的是你是不正確的。 LINQ Join運算符總是進行內連接。 http://www.hookedonlinq.com/JoinOperator.ashx

如果你想做一個左外連接,你需要使用select或foreach的組合。看到這些例子:

或者google一下,有一噸的例子在那裏。

+0

ps如果你徹底學會了'Select'操作符,你可以不使用'Join'操作符就可以離開。 – 2010-03-27 09:02:19

1

最好不要在可能的情況下使用連接運算符,並依賴遍歷實體間數據上下文中建立的關係。

from r in Rabbits 
select 
{ 
    r.Name 
    r.Parent.Name 
} 

這將自動遍歷父關係並決定運行適當的sql。

正確使用.DefaultIfEmpty()將意味着添加了任何NULL條目,因此將其轉換爲適當的外部聯接。這可以與join操作符一起使用,方法是加入'into'。

JOIN and LEFT JOIN equivalent in LINQ

+0

我不僅僅是這樣,並且使用dataloadoptions在同一個查詢中獲取Rabbit和Parent。我的問題是linq如何決定在rabits和父母之間使用join的類型? – user287795 2010-03-30 17:52:38

+0

這是由您選擇的內容以及關係中涉及的字段是否可以爲空來決定的。 – SteadyEddi 2010-03-30 19:51:44