2014-04-06 112 views
0

显示我的问题,我试图解释一个样本:实体框架性能VS传统ADO.Net

假设我有一个表UsersInfo这些列:

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

现在我想选择LockStatus从这张桌子。在传统模式下,我们取得这个查询并将其发送给SqlCommand用于执行:

SELECT LockStatus FROM UsersInfo 

今天在使用实体框架,我们使用这个来自查询:

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 

但是当我使用实体框架(LINQ ||实体SQL),在SQL Server探查表明,该结果:

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万条记录,表现会非常糟糕!

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

您认为如何?有什么办法吗?

+0

你做错了什么。EF将查询所有字段以生成对象 - 显然。但是如果你在查询中做了一个处理,那么它就不会。 THAT说 - 这是我的帮助结束的地方,因为我不熟悉LINQ sql语法,更喜欢我自己的函数式语法。我绝对没有这个问题。 – TomTom

+0

虽然我明白查询看起来很沉重,但我发现EF(现在在v6)与传统的ADO.NET一样快,并且我拥有数十万行的表 - 提供查询被正确书写。如果您担心**的表现**,您是否考虑过在表现**上进行测试**? –

回答

2

EF生成的查询中有一个冗余派生表,但最终只选择一列。 SQL Server以及可能的任何主流RDBMS,在这种情况下只能物理地触及单个列。不要担心表现。这只是化妆品。

你没有做错任何事。没有什么可以为你做的。

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 
    }; 

你会得到一个匿名的投影而无需进行额外的对象。 (并且没有额外的字段以基于范围。)

+0

我试试这个! 但它给我错误 – Jourmand

+0

@Jourmand:***什么***错误!?!?!?记住:我们**不能**阅读你的屏幕,也不能阅读你的想法! –

+0

我的原始代码是: 'var d = new Data_DBEntities(); 变种Q =从d.UsersInfo [R 选择新 { r.LockStatus };' 但我的问题是:为什么EF选择所有字段的,是正常?我使用LINQ,然后尝试实体SQL,但两种方式我看到相同的结果。 – Jourmand