使用EF检查表中的新记录的最便宜的操作

时间:2016-05-30 13:41:45

标签: c# entity-framework postgresql entity-framework-core

我让PostgreSQL和EF7一起运行。

我的表结构:

  • Id(bigint)
  • 内容(文字)
  • CreatedAt(没有时区的时间戳NOT NULL)

我的前端应用程序无限滚动,查询结果为.Skip(n)& 。取(M)。 即。

_myRepository.GetAll().Where(x => x.CreatedAt > newestActivityDate).Count();

现在,在滚动时,如果有更新的记录,我必须知道有多少并将它们添加到.Skip(n)函数中。我不需要显示它们,只需要在跳过时添加它们。

目前我正在检查它们,但是在表格超过50k-100k记录之后,这看起来应该相当昂贵:

public IQueryable<Activity> GetAll()
{
    return _context.Activities.OrderByDescending(x => x.CreatedAt);
}

GetAll():

{{1}}

检查是否有新记录和最佳记录的最佳(最佳效果)操作是什么?多少?按日期检查,只有在有任何新记录时才进行计数?

编辑: 添加了GetAll()描述以获得更清晰。

1 个答案:

答案 0 :(得分:1)

我不知道你的.GetAll()方法做了什么,所以这确实是你问题的症结所在。

LINQ具有所谓的deferred execution。这意味着在对结果采取行动之前不会执行查询。因此,在您构建SQL查询的情况下,在完成之前不会将任何内容发送到数据库。

因此,如果您的.GetAll()方法在那里查询.ToList(),那么它会在添加剩余的过滤之前立即从数据库中提取所有内容。在那种情况下,是的,它会非常昂贵。

然而,你可以通过询问计数来解决这个问题。你已经完成了大部分设置。

如果您在存储库中添加一个新方法,如下所示:

public int GetNewRecordsCount(DateTime newestActivityDate)
{
    _context.Widgets.Count(x => x.CreatedAt > newestActivityDate);
}

然后,这将创建一个与此类似的不同SQL查询:

SELECT COUNT(*)
FROM Widgets
WHERE CreatedAt > newestActivityDate;

这是一个非常快速的操作,数据库将为您执行所有过滤。返回到您的代码的唯一事情就是总计数的单行,单列结果。