У меня есть этот оператор 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 entity),
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 to entity, похоже, генерирует больше сложный 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-сервер.
Это может быть не так просто, потому что запросы разные.
Я взял второй запрос и разбил его на подобный подзапрос (вручную),
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
SQL-сервер показывает тот же план выполнения для обоих, поэтому, как вы говорите, SQL-сервер может оптимизировать его довольно хорошо. Informix, с другой стороны, сомневается в оптимизации вещей.