C# 使用EF检查表中新记录的最便宜操作
我让PostgreSQL与EF7一起运行 我的表格结构:C# 使用EF检查表中新记录的最便宜操作,c#,entity-framework,postgresql,entity-framework-core,C#,Entity Framework,Postgresql,Entity Framework Core,我让PostgreSQL与EF7一起运行 我的表格结构: Id(bigint) 内容(文本) CreatedAt(不带时区的时间戳不为空) 我的前端应用程序中有无限滚动条,查询结果带有.Skip(n)和.Take(m)。 即 GetAll(): public IQueryable GetAll() { 返回_context.Activities.OrderByDescending(x=>x.CreatedAt); } 检查是否有新记录的最佳(最有效)操作是什么?有多少?按日期检查,只有在有
- Id(bigint)
- 内容(文本)
- CreatedAt(不带时区的时间戳不为空)
public IQueryable GetAll()
{
返回_context.Activities.OrderByDescending(x=>x.CreatedAt);
}
检查是否有新记录的最佳(最有效)操作是什么?有多少?按日期检查,只有在有新记录时才进行计数
编辑:
为了更加清晰,添加了GetAll()说明。我不知道你的
.GetAll()方法做了什么,所以这才是问题的症结所在
林克拥有所谓的。这意味着在对结果进行操作之前,查询不会执行。因此,在构建SQL查询时,在完成之前,不会向数据库发送任何内容
因此,如果您的.GetAll()
方法在其中使用.ToList()
进行查询,那么它将在添加其余筛选之前立即从数据库中提取所有内容。那样的话,是的,会很贵
不过,你只要问一下伯爵就可以解决这个问题。你已经准备好了大部分
如果在存储库中添加新方法,如下所示:
public int GetNewRecordsCount(DateTime newestActivityDate)
{
_context.Widgets.Count(x => x.CreatedAt > newestActivityDate);
}
然后,这将创建一个不同的SQL查询,该查询与以下内容类似:
SELECT COUNT(*)
FROM Widgets
WHERE CreatedAt > newestActivityDate;
这是一个非常快速的操作,数据库将为您执行所有过滤。返回给代码的唯一内容就是总计数的单行、单列结果。是否GetAll()
返回iqeryable
?是的,GetAll()返回iqeryable如果您总是知道“newestActivityDate”-一个选项是仅用Where限制查询(x=>c.CreatedAt那么它不应该那么昂贵,生成的SQL将使用COUNT()
,这相对来说是很好的(除非您希望反规范化并将计数器保存到其他地方)@Evk这可能是一个选项,是的,但除了查询旧的结果外,我还想知道是否有新的活动,如果有,显示一个不错的标签,上面写着:)Count
可以采用一个标准,而您根本不需要Where
:DThanks。休息了一天,我刚刚醒来。没问题,我只是想对您的答案进行改进;)可以。这不一定有帮助。5万到10万张唱片没那么多。使用和不使用索引运行一些测试。不要忘记测试插入、更新和删除速度,因为所有这些都会受到索引的影响。
public IQueryable<Activity> GetAll()
{
return _context.Activities.OrderByDescending(x => x.CreatedAt);
}
public int GetNewRecordsCount(DateTime newestActivityDate)
{
_context.Widgets.Count(x => x.CreatedAt > newestActivityDate);
}
SELECT COUNT(*)
FROM Widgets
WHERE CreatedAt > newestActivityDate;