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伊万诺夫真实的,你是正确的。还应该考虑两个空值的情况,并且星号子句可以做到这一点。