gpt4 book ai didi

c# 根据日期列表查找开始日期和结束日期?

转载 作者:行者123 更新时间:2023-12-05 05:33:25 26 4
gpt4 key购买 nike

我有一个包含超过 20 万条记录的数据库表和一个包含日期 (NOT NULL) 的列。我正在努力执行 GroupBy 日期,因为数据库很大,查询需要很长时间才能处理(大约 1 分钟左右)。

我的理论:

  • 从该表中获取所有记录的列表
  • 从该列表中找到结束日期和开始日期(基本上是最早的日期和最新的日期)
  • 然后取大约 20 个日期来执行 GroupBy,这样查询将在较短的记录集中完成。

这是我必须获取列表的模型:

registration.Select(c => new RegistrationViewModel()
{
DateReference = c.DateReference,
MinuteWorked = c.MinuteWorked,
});
  • DateReference 是我必须使用的数据库列...

我不太确定如何在不花太长时间的情况下循环浏览我的列表以获取日期的开始和结束。

知道怎么做吗?

编辑:

var registrationList = await context.Registration 
.Where(c => c.Status == StatusRegistration.Active) // getting all active registrations
.ToRegistrationViewModel() // this is simply a select method
.OrderBy(d => d.DateReference.Date) // this takes long
.ToListAsync();

GroupBy:

 var grpList = registrationList.GroupBy(x => x.DateReference.Date).ToList();

var tempList = new List<List<RegistrationViewModel>>();
foreach (var item in grpList)
{
var selList = item.Select(c => new RegistrationViewModel()
{
RegistrationId = c.RegistrationId,
DateReference = c.DateReference,
MinuteWorked = c.MinuteWorked,
}).ToList();

tempList.Add(selList);
}

这是我的 SQL 表: registration table T-SQL

这是 ToRegistrationViewModel() 函数:

 return registration.Select(c => new RegistrationViewModel()
{
RegistrationId = c.RegistrationId,
PeopleId = c.PeopleId,
DateReference = c.DateReference,
DateChange = c.DateChange,
UserRef = c.UserRef,
CommissionId = c.CommissionId,
ActivityId = c.ActivityId,
MinuteWorked = c.MinuteWorked,
Activity = new ActivityViewModel()
{
Code = c.Activity.Code,
Description = c.Activity.Description,
},
Commission = new CommissionViewModel()
{
Code = c.Commission.Code,
Description = c.Commission.Description
},
People = new PeopleViewModel()
{
UserId = c.People.UserId,
Code = c.People.Code,
Name = c.People.Name,
Surname = c.People.Surname,
Active = c.People.Active
}
});

最佳答案

这里有多个潜在的问题

缺少索引

您的查询使用了 Status 和 DateReference,看起来都没有索引。如果只有几个事件状态,该列上的索引可能就足够了,否则您需要日期上的索引来加速排序。您还可以考虑包含两列的复合索引。适当的索引应该可以解决排序问题。

具体化查询

ToListAsync 将触发 sql 查询的执行,使每个后续操作都在客户端上运行。我也会高度怀疑 ToRegistrationViewModel,我会尝试将其更改为匿名类型,并且仅在查询实现后才转换为实际类型。在客户端运行诸如排序和分组之类的东西通常被认为是一个坏主意,但您需要考虑实际瓶颈在哪里,如果数据传输花费最多时间,优化分组将无济于事。

传输数据

无论如何,获取大量行都会很慢。目标通常是尽可能多地在数据库中进行过滤,因此您不需要获取那么多行。如果您必须获取大量记录,您可以使用 Pagination ,即将 OrderBy 与 Skip 和 Take 结合起来以获取更小的数据 block 。这总体上不会节省时间,但可以实现进度和连续显示数据等事情。

关于c# 根据日期列表查找开始日期和结束日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73850402/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com