【问题标题】:How to get the latest row in a table using Entity Framework (considering performance)?如何使用实体框架获取表中的最新行(考虑性能)?
【发布时间】:2014-03-11 10:58:40
【问题描述】:

我担心性能,特别是在大桌子上。 在我的示例中,StatusId 是 IDENTIY PRIMARY KEY

我想知道是否有更好的方法(更快)来获取表中的最后一个条目。

  public IQueryable<GaStatus> GetLastStatus()
    {
        return context.GaStatuses.OrderByDescending(x => x.StatusId).Take(1);
    }

【问题讨论】:

  • 如果您只请求一项,则不应返回 IQueryable
  • @AcidJunkie 为什么?在此示例中,查询尚未执行,这可能是他们想要的。例如使其成为其他查询的一部分。
  • 我认为你应该使用 LastOrDefault 因为你只想要最后一条记录,而 StatusId 是主键。
  • LastOrDefault 应该返回所有条目,然后取最后一个 - 不确定大桌子上的性能 - 无论如何感谢分享

标签: c# asp.net performance linq entity-framework


【解决方案1】:

实体框架为我生成以下 SQL:

SELECT TOP (1) 
[Extent1].[StatusId] AS [StatusId]
FROM [dbo].[GaStatuses] AS [Extent1]
ORDER BY [Extent1].[StatusId] DESC

这看起来是获得所需结果的合理方法,尽管“Extent1”不易阅读。参见例如How to read the last row with SQL Server

因此,我认为在 Entity Framework 中没有更好或更快的方法来做到这一点。

但几乎总有一种方法可以提高给定 SQL 查询的性能。例如,查看我的特定数据库中的执行计划,ORDER BY 执行聚集索引扫描This might or might not be good from a performance point of view. 因此,根据您的数据库,您可能能够通过直接编写 SQL 而不是让实体框架为您生成它来识别性能问题并提高性能。

【讨论】:

    【解决方案2】:

    return context.GaStatuses.Max(x =&gt; x.StatusId);

    【讨论】:

    • @ken2k 看看实际的 SQL 执行计划会说不然。主要负载来自索引扫描。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 2022-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多