【问题标题】:LINQ Select FirstLINQ 先选择
【发布时间】:2015-07-18 08:13:09
【问题描述】:

嗨,我有这段 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

【问题讨论】:

    标签: c# linq lambda


    【解决方案1】:

    在使用First() 之前,先投影到name 属性:

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

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

    【讨论】:

    • 很想看看这段代码在 Profiler 中是什么样子的。
    • @dtown123 是的,这是我做的第一件事,哈哈,我在答案中添加了代码。
    • lnq.attaches.First( a => a.sysid == sysid ).name会更紧凑(并且可能更高效)
    • @EthanBrown:不——这就是这个问题的全部内容。阅读问题 ;-) - First() 在这种情况下,没有事先投影将实现 all 列 - OP 只想实现一个列值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 2010-10-06
    • 2010-10-12
    相关资源
    最近更新 更多