LINQ选择第一个操作

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 *",这会导致查询执行表扫描而不是使用索引。这对性能不利。

我该如何只选择"name"列,比如:

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

预先感谢。


编辑: Broken Glasses Solution 的配置文件符合要求。

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

33

在使用 First() 之前,请将项目分配给 name 属性:

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

然而,这并不改变索引的使用 - 在此,您的Where子句负责(在初始查询中,您传递给First()的lambda表达式)。两个查询都受益于对name列的索引,第二个查询只是更快,因为只需要将一个列值实例化。


1
很想看看这段代码在 Profiler 中的样子。 - dtown123
@dtown123 是的,那是我做的第一件事哈哈,我在答案中添加了代码。 - bumble_bee_tuna
1
使用 lnq.attaches.First(a => a.sysid == sysid).name 可以使代码更加简洁(并且可能更高效)。 - Ethan Brown
2
@EthanBrown:不是的 - 这就是这个问题的关键。请仔细阅读问题;-) - 在此情况下,没有先前的投影,First()将实现所有列 - OP只想实现一列值。 - BrokenGlass

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接