LINQ选择第一

bum*_*una 19 c# linq lambda

嗨,我有这个linq代码

var fp = lnq.attaches.First(a => a.sysid == sysid).name;
Run Code Online (Sandbox Code Playgroud)

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

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

我看待它的方式,它像select*一样返回,这将导致查询执行表扫描,而不是使用索引.表现不佳.

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

SELECT TOP (1)[t0].[name] FROM [lntmuser].[attach] AS [t0]
Run Code Online (Sandbox Code Playgroud)

提前致谢


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

SELECT TOP (1) [t0].[name]
FROM [lntmuser].[attach] AS [t0]
WHERE [t0].[sysid] = @p0
Run Code Online (Sandbox Code Playgroud)

Bro*_*ass 29

项目name前使用First():

var fp = lnq.attaches.Where(a => a.sysid == sysid)
                     .Select(a => a.name)
                     .First();
Run Code Online (Sandbox Code Playgroud)

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

  • @EthanBrown:不 - 这就是这个问题的全部内容.阅读问题;-) - 没有预先投影的`First()`将在这种情况下实现**所有**列 - OP只想实现一个列值 (2认同)