我的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