Почему платформа Entity генерирует этот 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 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, с другой стороны, сомневается в оптимизации вещей.

12
задан peter 29 May 2011 в 22:04
поделиться