簡體   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