实体框架连接可空连接列

时间:2011-02-14 16:57:36

标签: entity-framework linq-to-entities left-join devart defaultifempty

我的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帽来完成工作。

2 个答案:

答案 0 :(得分:2)

完全没问题,按预期工作,额外的条件确保当两者都是null时加入,因为null = null在SQL中不是真的

答案 1 :(得分:1)

@K伊万诺夫,你是对的。应该考虑两个空值的情况,并且星号条款可以解决这个问题。