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()

注意:连接列是数据库中的可为空类型,因此是十进制的?在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 帽子来完成工作。

4

2 回答 2

2

这很好,按预期工作,额外的条件确保当两者都因为在 SQL 中不正确null的事实而加入时null = null

于 2011-02-14T17:11:43.593 回答
1

@K Ivanov,你是对的。两个空值的情况也应该考虑在内,加星号的子句就可以了。

于 2011-02-15T12:08:15.977 回答