[英]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
日期范圍重疊:
a
或b
中的至少一個在s
和f
之間a
< f
和b
> s
x.Sdate < dormapplication.Edate && x.Edate > dormapplication.Sdate
a
不晚於s
,並且b
不早於f
a
<= s
和b
>= 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.