24

嗨,我有这段 linq 代码

var fp = lnq.attaches.First(a => a.sysid == sysid).name;

分析时,它会生成以下 t-sql

SELECT TOP (1) [t0].[sysid], [t0].[name], [t0].[att_size], [t0].[cid], [t0].[flags], [t0].[contents] 
FROM [lntmuser].[attach] AS [t0]

在我看来,它像 select * 一样返回,这将导致查询执行表扫描而不是使用索引。对性能不利。

我怎么能只选择名称列,例如:

SELECT TOP (1)[t0].[name] FROM [lntmuser].[attach] AS [t0]

提前致谢


编辑:根据需要破碎的眼镜解决方案配置文件

SELECT TOP (1) [t0].[name]
FROM [lntmuser].[attach] AS [t0]
WHERE [t0].[sysid] = @p0
4

1 回答 1

31

在使用之前项目到name属性First()

var fp = lnq.attaches.Where(a => a.sysid == sysid)
                     .Select(a => a.name)
                     .First();

不过,这不会改变索引的使用 - 因为您的Where子句负责(在您的初始查询中,您传递给 lambda First())。两个查询都受益于name列上的索引,第二个查询更快,因为只需实现一个列值。

于 2012-04-14T00:35:20.403 回答