que tiene esta declaración de LINQ,¿Por qué el marco Entity genera este SQL?
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
};
Se genera SQL en esta forma (LINQ a las entidades),
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
¿Cuál es el razonamiento para esto? Yo hubiera pensado algo como esto era suficiente,
SELECT
fields
FROM table as Project1
WHERE blah
ORDER BY blah ASC
Recuerdo que LINQ a SQL tendería a generar el SQL más simple.
He visto ejemplos más complicados con combinaciones, etc., y LINQ a entidades parece generar el SQL más complicado.
ACTUALIZACIÓN:
Es muy interesante porque yo estaba tratando de probar lo que está diciendo y me encontré con este LINQ,
var attachments = (from a in entities.Attachments
where a.AttachmentID == 749
select new {a.AddedOn, a.AddedBy});
y que genera este SQL,
SELECT
[Extent1].[AttachmentID] AS [AttachmentID],
[Extent1].[AddedOn] AS [AddedOn],
[Extent1].[AddedBy] AS [AddedBy]
FROM [dbo].[Attachment] AS [Extent1]
WHERE 749 = [Extent1].[AttachmentID]
Éste no tiene una sub-consulta.
La diferencia es (bueno, al menos uno de ellos) ... aguarde. Informix. La primera consulta arriba que genera la subconsulta usa informix. La segunda consulta que no es SQL server.
Puede que no sea tan simple porque las consultas son diferentes.
Me hizo tomar la segunda consulta y romperlo en una sub-consulta como esta (manualmente),
SELECT
[Project1].[AttachmentID] AS [AttachmentID],
[Project1].[AddedOn] AS [AddedOn],
[Project1].[AddedBy] AS [AddedBy]
FROM (SELECT
[Extent1].[AttachmentID] AS [AttachmentID],
[Extent1].[AddedOn] AS [AddedOn],
[Extent1].[AddedBy] AS [AddedBy]
FROM [dbo].[Attachment] AS [Extent1]
WHERE 749 = [Extent1].[AttachmentID]
) AS Project1
servidor SQL muestra el mismo plan de ejecución para los dos, de modo que usted dice servidor SQL es capaz de optimizarlo bastante bien Informix, por otro lado, tiene sombra para optimizar las cosas.