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

前端之家收集整理的这篇文章主要介绍了为什么实体框架生成这个SQL?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有这个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语句的查询计划很可能与没有子查询的“优化”相同.

猜你在找的MsSQL相关文章