2011-09-02 62 views
0

我正在嘗試使用linq做左外連接。我發誓這幾個星期前我寫作和測試了它,但現在它並沒有真正加入雙方。linq左外連接的產品不保持右側

var combined = from h in historyTable 
join d in (from d in deviceTable where d.DeviceType == 5 select d) on h.SerialNumber equals d.SerialNumber into dh 
from subDH in dh.DefaultIfEmpty() 
select subDH; 

這應該作爲一個左外連接,對嗎?我不會錯過一些至關重要的事情,因爲所有這些都應該在SerialNumber中加入每個表。我做了一個SQL版本,它工作得很好。

SELECT * 
FROM [deviceTable] AS [t0] 
LEFT OUTER JOIN (
    SELECT * 
    FROM [historyTable] 
    ) AS [t1] ON [t0].[SerialNumber] = [t1].[SerialNumber] 
WHERE [t0].[DeviceType] = 5 
GO 

我在做什麼不正確?

+0

你可以在執行命令後描述'combined'中包含的內容嗎?是否有運行時錯誤?編譯時錯誤?如果有輸出,它與預期的有什麼不同? – lsuarez

回答

0

看起來你的SQL的左右兩邊都是圓的。試試這個:

var combined = from d in deviceTable 
       where d.DeviceType == 5 
       join h in historyTable on d.SerialNumber equals h.SerialNumber 
         into dh 
       from subDH in dh.DefaultIfEmpty() 
       select new { d, subDH }; 
+0

謝謝,但是目前我在哪方面對我無所謂,我只是想弄清楚爲什麼dh和subDH被視爲與deviceTable完全相同的表類型。它不應該是兩者的組合,即有兩個表的列嗎? – Tory

+0

@Tory:否 - 'dh'包含與「左」表的當前元素相對應的「右」表的元素 - 這就是爲什麼我在示例查詢中獲得對匿名類型的投影。 –

+0

好的。我不明白爲什麼程序員選擇這樣做,以便新桌子只是左桌組合的桌子,但顯然這就是它的樣子。我已經按照我需要的方式工作,所以感謝您的幫助。 – Tory