我有这个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 };
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到实体似乎生成了更复杂的sql.
更新:
这是非常有趣的,因为我试图测试你在说什么,我遇到了这个LINQ,
var attachments = (from a in entities.Attachments where a.AttachmentID == 749 select new {a.AddedOn,a.AddedBy});
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语句的查询计划很可能与没有子查询的“优化”相同.