Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用EF检查表中新记录的最便宜操作_C#_Entity Framework_Postgresql_Entity Framework Core - Fatal编程技术网

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

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); } 检查是否有新记录的最佳(最有效)操作是什么?有多少?按日期检查,只有在有

我让PostgreSQL与EF7一起运行

我的表格结构:

  • Id(bigint)
  • 内容(文本)
  • CreatedAt(不带时区的时间戳不为空)
我的前端应用程序中有无限滚动条,查询结果带有.Skip(n)和.Take(m)。 即

GetAll():

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;