2009-11-04 128 views
1

我使用Entity Framework和SQL Server Express的2008年當使用探查,我看到這樣的SQL:如何使生成的實體框架生成的SQL清潔

SELECT 
[Project1].[C1] AS [C1], 
[Project1].[EmployeeID] AS [EmployeeID], 
[Project1].[FirstName] AS [FirstName], 
[Project1].[LastName] AS [LastName], 
[Project1].[Active] AS [Active], 
[Project1].[Updated] AS [Updated], 
[Project1].[Created] AS [Created], 
[Project1].[CreatedBy] AS [CreatedBy], 
[Project1].[Modified] AS [Modified], 
[Project1].[ModifiedBy] AS [ModifiedBy] 
FROM (SELECT 
    [Extent1].[EmployeeID] AS [EmployeeID], 
    [Extent1].[FirstName] AS [FirstName], 
    [Extent1].[LastName] AS [LastName], 
    [Extent1].[Active] AS [Active], 
    [Extent1].[Updated] AS [Updated], 
    [Extent1].[Created] AS [Created], 
    [Extent1].[CreatedBy] AS [CreatedBy], 
    [Extent1].[Modified] AS [Modified], 
    [Extent1].[ModifiedBy] AS [ModifiedBy], 
    1 AS [C1] 
    FROM [dbo].[Employee] AS [Extent1] 
) AS [Project1] 
ORDER BY [Project1].[LastName] ASC 

是否有什麼我打電話子查詢會影響SQL Server和/或我的應用程序的性能嗎?如果我要手寫這個SQL查詢,它看起來更像這樣:

SELECT 
[Project1].[EmployeeID] AS [EmployeeID], 
[Project1].[FirstName] AS [FirstName], 
[Project1].[LastName] AS [LastName], 
[Project1].[Active] AS [Active], 
[Project1].[Updated] AS [Updated], 
[Project1].[Created] AS [Created], 
[Project1].[CreatedBy] AS [CreatedBy], 
[Project1].[Modified] AS [Modified], 
[Project1].[ModifiedBy] AS [ModifiedBy] 
FROM [dbo].[Employee] AS [Project1] 
ORDER BY [Project1].[LastName] ASC 

有沒有辦法讓這個更清潔?爲什麼創建子查詢?我應該在乎嗎?我正在使用LinqToEntities。下面是創建的第一個SQL樣的功能:

public DTO.EmployeeDTO[] GetEmployees() 
{ 
    using (KDMEntities ctx = new KDMEntities()) 
    { 
     var employees = (from e in ctx.Employees 
         orderby e.LastName 
         select new DTO.EmployeeDTO 
         { 
          EmployeeID = e.EmployeeID, 
          FirstName = e.FirstName, 
          LastName = e.LastName, 
          Active = e.Active, 
          Updated = e.Updated, 
          Created = e.Created, 
          CreatedBy = e.CreatedBy, 
          Modified = e.Modified, 
          ModifiedBy = e.ModifiedBy 
         }).ToArray(); 
     return employees; 
    } 
} 

回答

5

首先,我想只要你得到「足夠好」說的表現,它的生產力之間的經典折衷(你不」不得不處理構造SQL的每一個部分,並且手動讀取SqlDataReaders等等)以及潛在的性能。

衡量,測量,衡量 - 看看它是否是確實是過早過度優化之前的問題。不要這樣做。第二,我不知道任何可用於掛鉤EF中SQL生成過程的擴展點 - 所以基本上你可以選擇:性能足夠好,可以得到習慣於EF可能會生成某些不同於我手動操作的語句 - 或者然後刪除它並使用其他內容。

再一次說明:這是一種折衷,因爲幾乎所有IT產品 - 通常是性能和生產力,只要性能足夠好,我不會花一分鐘時間優化用戶和經理和客戶並不在乎。

+1

+1爲措施,然後決定。過早優化是一個黑洞。 – 2009-11-05 14:56:16

+0

我不同意你在說什麼,但這並不回答OP的問題。在我看來,如果你不知道幕後發生了什麼,這是一場潛在的表演噩夢。我剛碰到這個完全相同的問題,我想了解如何防止EF創建此子查詢。 – DMC 2012-05-01 18:18:59