4

我的Devart實體框架提供程序將以下linq連接到實體。實體框架連接可以爲空的連接列

from p in context.BEAT_CONTACT 
join cl in context.COMPASS_LOCATIONS 
on p.GAZETEER_KEY equals cl.GAZETTEER_KEY 
//on new { bcdid = p.GAZETEER_KEY.Value } 
//equals new { bcdid = cl.GAZETTEER_KEY.Value } 
into myRandomlj 
from rr in myRandomlj.DefaultIfEmpty() 

注意:連接列在DB中是可以爲空的類型,因此是小數?在C#中

生成的SQL是:

FROM NP_TEST.BEAT_CONTACT "Extent1" 
LEFT OUTER JOIN NOTTS_DW_OWNER.COMPASS_LOCATIONS "Extent2" 
ON ("Extent1".GAZETEER_KEY = "Extent2".GAZETTEER_KEY) 
* OR (("Extent1".GAZETEER_KEY IS NULL) 
* AND ("Extent2".GAZETTEER_KEY IS NULL)) 

標有星號(*)或和,並增加額外秒到我的SQL的執行。當語句放入蟾蜍(oracle devart ef provider btw)時,加上已加星號的項目會明顯運行得更快。

我的問題是:我的linq是錯誤的實體或失蹤的東西?或者是Devart EF提供商的錯誤?

對問題的更新: 您好,作爲此問題的原始創建者,我想嘗試在可能的情況下對問題進行一些澄清。從LukLed的評論 - 「默認實體框架提供者能夠正確工作並且不會創建這樣的SQL條件,這不僅是錯誤的,它還是一個巨大的性能打擊者。」我主要關心的是「性能打擊者」的評論,這個打擊是巨大的,特別是隨着行數在連接的任何一邊攀升。我不得不用ExecuteStoreQuery或Sproc來繞過這種行爲。這意味着沒有LINQ,我不得不戴上我的SQL帽子來完成工作。

+0

我會說這是一個巨大的提供者錯誤。 – LukLed 2011-02-14 21:44:20

+0

@LukLed,這不是一個錯誤。考慮連接列中兩個空值的情況。 SQL將兩個空值視爲不相等的值。 – Devart 2011-02-15 12:08:34

回答

2

是完全正常的,按預期工作,額外的條件時,務必都是null上加入由於事實null = null是不是在SQL

1

@K伊萬諾夫真實的,你是正確的。還應該考慮兩個空值的情況,並且星號子句可以做到這一點。