繁体   English   中英

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

[英]c# find start date and end date based on a list of dates?

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

我的理论:

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

这是我必须得到列表的 Model:

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();

分组:

 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 表: 注册表 T-SQL

这是ToRegistrationViewModel() function:

 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 结合起来以获取较小的数据块。 这不会总体上节省时间,但可以允许诸如进度和连续显示数据之类的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM