簡體   English   中英

如何檢查 LINQ 中的日期范圍重疊

[英]how to check Date range overlap in LINQ

我有一個表名“StayRooms”,當用戶選擇日期范圍時,我想檢查日期范圍是否與表中的任何記錄重疊,

我在 LINQ 下面試過了,

  var overlap = _db.StayRooms.Where(x => x.tenant == LoginAccount && dormapplication.Sdate >= x.Sdate && dormapplication.Edate <= x.Edate).Select(y => y.days).FirstOrDefault();

但並非總是成功。

誰能建議我在這里錯過了什么?

例如:

`s` and `f` represents    that have record (date range )in table
 
`a` represents the start of choice
`b` represents the end of choice





       s-----f       overlap
  -----+-----+-----  -------  
   a-b |     |        NO
   a---b     |        NO
   a-----b   |        YES
   a---------b        YES
   a-----------b      YES
       a---b |        YES
       a-----b        YES
       a-------b      YES
       | a-b |        YES
       | a---b        YES     
       | a-----b      YES     
       |     a-b      NO
       |     | a-b    NO

根據您的重疊概述,如果滿足以下條件之一,則日期范圍與s--f日期范圍重疊:

  • ab中的至少一個在sf之間
    --> a < fb > s
    --> x.Sdate < dormapplication.Edate && x.Edate > dormapplication.Sdate
  • a不晚於s ,並且b不早於f
    --> a <= sb >= f
    --> x.Sdate <= dormapplication.Sdate && x.Edate >= dormapplication.Edate

因此,我認為您應該通過替換原來的Where條件來實現所需的過濾

.Where(x => 
    x.tenant == LoginAccount && 
    dormapplication.Sdate >= x.Sdate && 
    temp <= x.Edate)

.Where(x => 
    x.tenant == LoginAccount && 
    (x.Sdate < dormapplication.Edate && x.Edate > dormapplication.Sdate ||
    x.Sdate <= dormapplication.Sdate && x.Edate >= dormapplication.Edate))

注意:在這種方法中,假設對於每個日期范圍, x.Sdate實際上早於x.Edate 如果您的原始代碼中不存在此邏輯,則可能需要引入額外的檢查。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM