我让PostgreSQL和EF7一起运行。
我的表结构:
我的前端应用程序无限滚动,查询结果为.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()描述以获得更清晰。
答案 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;
这是一个非常快速的操作,数据库将为您执行所有过滤。返回到您的代码的唯一事情就是总计数的单行,单列结果。