实体框架性能与传统ADO.Net相比

时间:2014-04-06 18:03:59

标签: sql sql-server entity-framework query-performance

为了表明我的问题,我尝试解释一个样本:

假设我有一个包含这些列的表UsersInfo

Id, UserName, Password, FName, LName, Gender, Birthday, 
HomeTel, Mobile, Fax, Email, LockStatus

现在我想从此表中选择LockStatus。在传统模式下,我们进行了此查询并将其发送到SqlCommand以执行:

SELECT LockStatus FROM UsersInfo

今天使用Entity Framework,我们从查询中使用它:

var q = from r in new Data_DBEntities().UsersInfo
        select new
        {
           r.LockStatus
        };

实体SQL:

SELECT UsersInfo.LockStatus
FROM Data_DBEntities.UsersInfo

现在我启动应用程序并使用SQL Server Profiler跟踪它。如果我使用第一种查询(传统模式),我会看到这个结果:

SELECT LockStatus FROM UsersInfo

但是当我使用Entity Framework(LINQ || Entity SQL)时,SQL Server Profiler会显示以下结果:

SELECT 
[Extent1].[LockStatus] AS [LockStatus]
FROM (SELECT 
      [UsersInfo].[Id] AS [Id], 
      [UsersInfo].[UserName] AS [UserName],
      [UsersInfo].[Password] AS [Password],
      [UsersInfo].[FName] AS [FName],
      [UsersInfo].[LName] AS [LName],
      [UsersInfo].[Gender] AS [Gender],
      [UsersInfo].[Birthday] AS [Birthday],
      [UsersInfo].[HomeTel] AS [HomeTel],
      [UsersInfo].[Mobile] AS [Mobile],
      [UsersInfo].[Fax] AS [Fax],
      [UsersInfo].[Email] AS [Email],
      [UsersInfo].[LockStatus] AS [LockStatus]
      FROM [dbo].[UsersInfo] AS [UsersInfo]) AS [Extent1]

我们可以看到后台的EF选择了所有列。

现在我的问题是:我只想选择一列,但EF会选择所有列。如果我的桌子上有10万条记录,那么表现真的很糟糕!

也许说使用函数或存储过程,但是当你想在不同的表中选择不同的列时,这不是一个好主意。

你怎么看?有什么办法吗?

2 个答案:

答案 0 :(得分:2)

EF生成的查询中包含冗余派生表但最终只选择一列。在这种情况下,SQL Server(可能是任何主流RDBMS)仅在物理上接触单个列。不要担心性能。这只是化妆品。

你没有做错任何事。你无事可做。

答案 1 :(得分:0)

您在LINQ查询中使用的语法强制重复选择。

您的投影创建了2个单独的对象。

var q = from r in new Data_DBEntities().UsersInfo创建了一个新对象,然后是

    select new
    {
       r.LockStatus
    };

基于第一个创建了一个新对象。您的第一部分中不需要new关键字。

如果您将查询更改为:

var q = from r in Data_DBEntities().UsersInfo
    select new
    {
       r.LockStatus
    }; 

您将获得没有其他对象的匿名投影。 (并且没有额外的字段来基于。)