2009-11-04 125 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