为了表明我的问题,我尝试解释一个样本:
假设我有一个包含这些列的表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万条记录,那么表现真的很糟糕!
也许说使用函数或存储过程,但是当你想在不同的表中选择不同的列时,这不是一个好主意。
你怎么看?有什么办法吗?答案 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
};
您将获得没有其他对象的匿名投影。 (并且没有额外的字段来基于。)