如何使实体框架生成的SQL更干净
我将实体框架与SQLServerExpress 2008一起使用。使用探查器时,我看到SQL是这样生成的:如何使实体框架生成的SQL更干净,sql,entity-framework,Sql,Entity Framework,我将实体框架与SQLServerExpress 2008一起使用。使用探查器时,我看到SQL是这样生成的: SELECT [Project1].[C1] AS [C1], [Project1].[EmployeeID] AS [EmployeeID], [Project1].[FirstName] AS [FirstName], [Project1].[LastName] AS [LastName], [Project1].[Active] AS [Active], [Project
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
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
拥有我所称的子查询是否会影响SQL Server和/或我的应用程序的性能?如果我手工编写此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
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;
}
}
首先,我想说,只要您获得“足够好”的性能,这就是生产率(您不必再处理构建每一个SQL和手动读取SqlDataReaders等)和潜在性能之间的经典权衡 测量,测量,测量-在过早地过度优化之前,看看它是否真的是一个问题。不要这样做 第二,,我不知道有任何扩展点可供您在EF中钩住SQL生成过程,因此基本上您可以选择:性能是否足够好,我是否可以习惯EF生成的某些语句可能与手动生成的语句不同,或者放弃它并使用其他语句
再次强调:这是一种折衷,因为几乎所有的东西都是这样的——通常是性能与生产率,只要性能“足够好”,我就不会花一分钟进行优化——你的用户、经理和客户都不在乎。首先,我要说的是,只要你的性能“足够好”,这是生产率(不再需要构建每一个SQL和手动读取SqlDataReaders等)和潜在性能之间的经典权衡 测量,测量,测量-在过早地过度优化之前,看看它是否真的是一个问题。不要这样做 第二,,我不知道有任何扩展点可供您在EF中钩住SQL生成过程,因此基本上您可以选择:性能是否足够好,我是否可以习惯EF生成的某些语句可能与手动生成的语句不同,或者放弃它并使用其他语句
再次强调:这是一种权衡,因为几乎所有方面都是如此——通常是性能与生产率,只要性能“足够好”,我就不会花一分钟进行优化——你的用户、经理和客户并不真的在乎。+1先衡量,然后再决定。过早优化是一个黑洞。我不同意你所说的,但这并不能回答OP的问题。在我看来,如果你不知道幕后发生了什么,这将是一场潜在的性能噩梦。我刚刚遇到了完全相同的问题,我想了解如何防止EF创建此子查询。首先测量+1,然后决定。过早优化是一个黑洞。我不同意你所说的,但这并不能回答OP的问题。在我看来,如果你不知道幕后发生了什么,这将是一场潜在的性能噩梦。我刚刚遇到了完全相同的问题,我想了解如何防止EF创建此子查询。