通常linq對其查詢使用左外部連接,但在某些情況下,它決定使用內部連接。 我有一種情況,該決定導致錯誤的結果,因爲第二個表並不總是有合適的記錄,並從第一個表中刪除記錄。 我在一個dbml上使用linqdatasource,其中相關的表是相同的,但是一個保存從第一個中刪除的歷史記錄。兩者都有相同的主鍵。而且我正在使用數據加載選項來一次加載兩個表而無需往返。linq如何決定內部和外部連接
你能否解釋爲什麼linq決定在這裏使用內連接?
謝謝
通常linq對其查詢使用左外部連接,但在某些情況下,它決定使用內部連接。 我有一種情況,該決定導致錯誤的結果,因爲第二個表並不總是有合適的記錄,並從第一個表中刪除記錄。 我在一個dbml上使用linqdatasource,其中相關的表是相同的,但是一個保存從第一個中刪除的歷史記錄。兩者都有相同的主鍵。而且我正在使用數據加載選項來一次加載兩個表而無需往返。linq如何決定內部和外部連接
你能否解釋爲什麼linq決定在這裏使用內連接?
謝謝
不,不幸的是你是不正確的。 LINQ Join
運算符總是進行內連接。 http://www.hookedonlinq.com/JoinOperator.ashx
如果你想做一個左外連接,你需要使用select或foreach的組合。看到這些例子:
或者google一下,有一噸的例子在那裏。
ps如果你徹底學會了'Select'操作符,你可以不使用'Join'操作符就可以離開。 – 2010-03-27 09:02:19
最好不要在可能的情況下使用連接運算符,並依賴遍歷實體間數據上下文中建立的關係。
from r in Rabbits
select
{
r.Name
r.Parent.Name
}
這將自動遍歷父關係並決定運行適當的sql。
正確使用.DefaultIfEmpty()將意味着添加了任何NULL條目,因此將其轉換爲適當的外部聯接。這可以與join操作符一起使用,方法是加入'into'。
我不僅僅是這樣,並且使用dataloadoptions在同一個查詢中獲取Rabbit和Parent。我的問題是linq如何決定在rabits和父母之間使用join的類型? – user287795 2010-03-30 17:52:38
這是由您選擇的內容以及關係中涉及的字段是否可以爲空來決定的。 – SteadyEddi 2010-03-30 19:51:44
請問一些代碼? – 2010-03-27 07:41:32