加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

为什么实体框架生成这个SQL?

发布时间:2020-12-12 16:45:01 所属栏目:MsSql教程 来源:网络整理
导读:我有这个LINQ语句, var carriageways = from carriageway in dataModelCurrentEntities.Carriageway where carriageway.RoadId == roadId carriageway.DistanceBreak == false orderby carriageway.CarriagewayStartInMetre select new CarriagewaySummary {
我有这个LINQ语句,
var carriageways = from carriageway in dataModelCurrentEntities.Carriageway
                   where carriageway.RoadId == roadId && carriageway.DistanceBreak == false
                   orderby carriageway.CarriagewayStartInMetre
                   select new CarriagewaySummary
                   {
                       StartMetres = carriageway.CarriagewayStartInMetre,EndMetres = carriageway.CarriagewayEndInMetre
                   };

它以此形式生成SQL(LINQ to entities),

SELECT 
Project1.field1 AS field1
Project1.field2 AS field2
FROM ( SELECT 
    Extent1.field1 AS field1,Extent1.field2 AS field2
    FROM table AS Extent1
    WHERE blah
)  AS Project1
ORDER BY blah ASC

这是什么原因?我会想到这样的话就够了,

SELECT 
fields
FROM table as Project1
WHERE blah
ORDER BY blah ASC

我记得LINQ to SQL会倾向于生成更简单的SQL.

我已经看了更多复杂的例子与连接等,LINQ到实体似乎生成了更复杂的SQL.

更新:

这是非常有趣的,因为我试图测试你在说什么,我遇到了这个LINQ,

var attachments = (from a in entities.Attachments
                  where a.AttachmentID == 749
                  select new {a.AddedOn,a.AddedBy});

而且生成这个SQL,

SELECT 
[Extent1].[AttachmentID] AS [AttachmentID],[Extent1].[AddedOn] AS [AddedOn],[Extent1].[AddedBy] AS [AddedBy]
FROM [dbo].[Attachment] AS [Extent1]
WHERE 749 = [Extent1].[AttachmentID]

这个没有子查询.

区别是(至少他们中的一个)…等等. Informix的.生成子查询的第一个查询是使用informix.第二个查询不是SQL Server.

它可能不是那么简单,因为查询是不同的.

我确实做了第二个查询,并将其分解成一个这样的子查询(手动),

SELECT 
[Project1].[AttachmentID] AS [AttachmentID],[Project1].[AddedOn] AS [AddedOn],[Project1].[AddedBy] AS [AddedBy]

    FROM ( SELECT

    [Extent1].[AttachmentID] AS [AttachmentID],[Extent1].[AddedBy] AS [AddedBy]
    FROM [dbo].[Attachment] AS [Extent1]
    WHERE 749 = [Extent1].[AttachmentID]
    ) AS Project1

SQL服务器显示相同的执行计划,因为你说SQL Server能够很好地优化它.另一方面,Informix在优化事情上是阴暗的.

解决方法

是否使用子查询生成SQL可能取决于您正在使用的实体框架提供程序.但是由于大多数现有的系统可能共享相同的谱系(因为它们可能是从Microsoft代码示例开始的),它们可能都是类似的SQL.给提供者提供一个从Linq语句生成并负责生成SQL的查询树.执行此操作的过程是访问查询树中的节点,并生成SQL.

在OP中的给定投影中,生成子查询是有意义的.它正在要求一组值(新的… {StartMetres,EndMetres}),它们取自前面的“查询”.因此,查询生成将产生“SELECT< requested values> FROM something”,其中“something”是本身,作为查询呈现.因此,查询树的简单访问将产生一个子查询.

一旦该过程完成,提供商当然可以“优化”生成的SQL并删除子查询.然而,这是SQL查询引擎真正擅长的一种事情,因此将该任务委托给查询引擎是有意义的.它可能取决于您正在使用的数据库,但是具有子查询的SQL语句的查询计划很可能与没有子查询的“优化”相同.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读