我的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))
已加星标的(*)OR和AND正在为我的sql执行添加额外的秒数。当声明被放入toad(oracle devart ef provider btw)时,带有已加星标的项目,sql显然运行得更快。
我的问题是:我的linq是实体有错还是遗失了什么?或者是Devart EF提供商的错误?
更新问题: 你好作为这个问题的原始创建者,我想尝试并尽可能明确问题。从LukLed的评论 - “默认实体框架提供程序正常工作,不创建这样的SQL条件。它不仅是错误的,它也是一个巨大的性能击球手”。我主要关注的是“性能击球手”的评论,这次打击很大,特别是当连接两侧的行数增加时。我不得不用ExecuteStoreQuery<>来规避这种行为。或者Sproc。这意味着没有linq,我不得不戴上我的sql帽来完成工作。
答案 0 :(得分:2)
完全没问题,按预期工作,额外的条件确保当两者都是null
时加入,因为null = null
在SQL中不是真的
答案 1 :(得分:1)