2013-08-26 52 views
4

在EF 4上工作C#.Face在連接中出現問題。 SQL語法如何在連接LINQ語法中比較null

Select a.Code, b.Name from DepartmentMaster a 
Join DepartmentDetail b on isnull(a.ID,0) =isnull(b.ID,0) 

注: a.ID,b.ID兩者都是可空

希望上述語法出來放在LINQ的語法.Bellow語法不是爲我工作

Var r=from a in DepartmentMaster 
Join b in DepartmentDetail on a.ID equals b.ID 
Select a.Code,b.Name 

需要幫助來編寫sql語法isnull()在linq ef中的可比較進程。

如果有任何疑問,請詢問,在先進

+0

你可以試試'a.ID ?? 0',但我不知道EF是否知道如何將其轉換爲SQL。也就是說,你最好不要在數據庫中處理0,並使其相同。將所有零全部轉換爲零或將所有零值轉換爲零(除非它們確實具有不同的含義),以便您不需要*執行此操作。 – Servy

+0

lazyberezovsky感謝您的回覆,我也這麼認爲,是否有任何過程或技術或任何給我想要的輸出 – shamim

+0

@shamim調查後我喜歡它不可能生成TSQL ISNULL函數,但它可能生成ANSI SQL COALESCE功能 –

回答

2

您可以使用空 - 如果id爲空,合併運營商提供默認值:

from c in DepartmentMaster 
join b in DepartmentDetail 
    on (a.ID ?? 0) equals (b.ID ?? 0) 
select new { 
    a.Code, b.Name 
} 

這將生成的查詢

SELECT [t0].[Code], [t1].[Name] AS [ID1] 
FROM [DepartmentMaster] AS [t0] 
INNER JOIN [DepartmentDetail] AS [t1] 
    ON (COALESCE([t0].[ID],@p0)) = (COALESCE([t1].[ID],@p1)) 

遠不如ISNULL完全相同,但結果應該是一樣的。

2

感謝這可能幫助你

Var r=from a in DepartmentMaster 
Join b in DepartmentDetail on a.(x => (int?)a.ID) ?? 0 equals b.(y => (int?)b.ID) ?? 0 
Select a.Code,b.Name 
0

你應該能夠做這樣的事情:

Join b in DepartmentDetail on (a.ID == null ? 0 : a.ID) equals (b.ID == null ? 0 : b.ID) 
1

您可以使用DefaultIfEmpty,它用一個默認值的集合替換一個空集合。因爲int的缺省值是0

var r=from a in DepartmentMaster 
join b in DepartmentDetail on a.ID.DefaultIfEmpty() equals b.ID.DefaultIfEmpty() 
Select a.Code,b.Name