为什么实体框架生成这个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语句的查询计划很可能与没有子查询的“优化”相同. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |