我的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帽子來完成工作。
我會說這是一個巨大的提供者錯誤。 – LukLed 2011-02-14 21:44:20
@LukLed,這不是一個錯誤。考慮連接列中兩個空值的情況。 SQL將兩個空值視爲不相等的值。 – Devart 2011-02-15 12:08:34