Entity framework 实体框架联接可为空的联接列

Entity framework 实体框架联接可为空的联接列,entity-framework,linq-to-entities,left-join,devart,defaultifempty,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

我的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执行过程中增加了额外的秒数。当语句被放入toad oracle devart ef provider btw中并带有带星号的项时,sql显然运行得更快

我的问题是:我的linq对实体有错还是遗漏了什么?还是Devart EF提供程序的故障

问题的最新情况:
你好,作为这个问题的最初创造者,如果可能的话,我想尝试澄清一下这个问题。根据LukLed的评论,默认实体框架提供程序工作正常,不会创建这样的SQL条件。这不仅是错误的,它也是一个巨大的性能打击。我主要关注的是击球手的评论,这是一个巨大的打击,尤其是当连接两边的行数上升时。我不得不通过ExecuteStoreQuery或Sproc来规避这种行为。这意味着没有linq,我不得不戴上我的sql帽子来完成这项工作。

这很好,正如预期的那样,额外的条件确保当两者都为null时连接打开,因为null=null在sql中不是真的,你是对的。两个空的情况也应该考虑在内,带星号的从句起到了作用。

好的,对不起,我也许应该把问题列在最后。我不希望在OR和被拼凑到连接上时响应缓慢。如果删除OR语句,返回的行数将相同。我想要亚秒级的性能,不允许它将查询转换为2/3秒和1比特秒。select语句是什么,也许我们可以在不连接的情况下重新编写LINQ语句LINQ to entity查询的目的是使用左连接填充多个表中的字段,以使我能够将数据的平面表示形式转换到实体中。所以你可以想象我的选择是选择新的神话{thingID=rr.thingID,thingText=ss.thingText}.toList;etc连接会像SQL一样引入所需的数据,但不必使用.Includeeverything或.Loadwhen我想写查询时几乎像SQL一样,因此使用DefaultIfEmpty的左侧外部连接。我不能让linq to entities剪裁和丢失不相关的数据,例如查找值。如果您没有任何记录的联接键为空值,最好是使这些键在数据存储中不可为空。这很可能就是我想要/需要的答案。然而,数据库设计目前是固定的。正如你们可能想象的,我可能有一个人有一个固定的地址,直到地理位置键,或者我可能有一个模糊的描述,他们可能居住的自由文本帐户。如果您没有任何记录的连接键为空值,最好是使数据存储中的连接键不为空。我认为这是提供程序中的一个巨大错误。@LukLed,这不是错误。考虑连接列中存在两个空值的情况。SQL将两个空值视为不相等的值。@德瓦特:我不同意。这不是预期的行为。如果有人使用这种语法,他希望它能按原样翻译成SQL。如果programmist想要通过NULL连接,他会明确地添加这个条件,但是谁真正通过NULL连接呢?默认实体框架提供程序工作正常,不会创建此类SQL条件。这不仅是错误的,而且是巨大的性能打击者。有人不明白,NULL是SQL中的特殊值,不应以相同的方式对待。@LukLed,我们刚刚对NorthwindEF SQL Server数据库重复了测试,对两个可为NULL的列执行了联接,并执行了相同的NULL检查。下面是测试LINQ查询:var q=来自db中的a。员工加入db中的b。a.CreationDate上的产品等于b.CreationDate进入n选择n.DefaultIfEmpty@德瓦特:嗯,你说得对。我早些时候检查过,但一定是出了什么问题。我认为这是最好的行为,但如果标准提供商也这样做,就没有讨论。谢谢你的回答。