嗨,我有这个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
答案 0 :(得分:28)
在使用name
之前预测到First()
媒体资源:
var fp = lnq.attaches.Where(a => a.sysid == sysid)
.Select(a => a.name)
.First();
这不会改变索引的使用 - 因为你的Where
子句负责(在你的初始查询中你传递给First()
的lambda)。两个查询都受益于name
列上的索引,第二个查询速度更快,因为只需要实现一个列值。