我的 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()
注意:连接列是数据库中的可为空类型,因此是十进制的?在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) 时,带有星号的项目 rem'd sql 显然运行得更快。
我的问题是:我的 linq 实体有错还是遗漏了什么?还是 Devart EF 提供程序的问题?
问题更新:您好,作为这个问题的原始创建者,如果可能的话,我想尝试弄清楚这个问题。来自 LukLed 的评论 - “默认实体框架提供程序正常工作,不会创建这样的 SQL 条件。这不仅是错误的,而且是一个巨大的性能打击”。我主要关心“性能打击者”的评论,这个打击是巨大的,尤其是当连接两侧的行数攀升时。我不得不使用 ExecuteStoreQuery<> 或 Sproc 来规避这种行为。这意味着没有 linq,我不得不戴上我的 sql 帽子来完成工作。