Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/94.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使实体框架生成的SQL更干净_Sql_Entity Framework - Fatal编程技术网

如何使实体框架生成的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

我将实体框架与SQLServerExpress 2008一起使用。使用探查器时,我看到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
拥有我所称的子查询是否会影响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创建此子查询。