使用 Linq 重叠两个日期之间的记录

Mik*_*keL 6 c# linq date

在我的应用程序中,用户可以委托另一个用户批准订单。

我需要验证的是,不存在循环引用,因此如果在某个时期内User A进行了委托,则不能在该时期内的任何时间进行委托,即存在重叠(日期):User BUser BUser Add/mm/yyyy

Delegator    Delegated To    DateFrom    DateTo
User A       User B          01/11/2012  08/11/2012
User A       User B          16/12/2012  24/12/2012
Run Code Online (Sandbox Code Playgroud)

这是我必须检查重叠的代码:

var overlaps = .Session.QueryOver<DelegateOrderApproval>()
    .Where(x => x.DateFrom > DateTime.Now && delegateOrderApproval.DelegatedUser.UserId == x.DelegatorUser.UserId)
    .And(x => x.DateFrom >= delegateOrderApproval.DateFrom && delegateOrderApproval.DateTo <= x.DateTo
              || (x.DateFrom >= delegateOrderApproval.DateFrom && x.DateTo <= delegateOrderApproval.DateTo)
              || (x.DateFrom <= delegateOrderApproval.DateFrom && x.DateTo >= delegateOrderApproval.DateFrom)
              || (x.DateFrom <= delegateOrderApproval.DateFrom && x.DateTo >= delegateOrderApproval.DateTo))
    .List();
Run Code Online (Sandbox Code Playgroud)

如果我尝试添加以下记录:

var overlaps = .Session.QueryOver<DelegateOrderApproval>()
    .Where(x => x.DateFrom > DateTime.Now && delegateOrderApproval.DelegatedUser.UserId == x.DelegatorUser.UserId)
    .And(x => x.DateFrom >= delegateOrderApproval.DateFrom && delegateOrderApproval.DateTo <= x.DateTo
              || (x.DateFrom >= delegateOrderApproval.DateFrom && x.DateTo <= delegateOrderApproval.DateTo)
              || (x.DateFrom <= delegateOrderApproval.DateFrom && x.DateTo >= delegateOrderApproval.DateFrom)
              || (x.DateFrom <= delegateOrderApproval.DateFrom && x.DateTo >= delegateOrderApproval.DateTo))
    .List();
Run Code Online (Sandbox Code Playgroud)

应该不会有冲突,因为在该时间段内User B没有代表?User A12 月份创下了纪录。

我已经搜索了日期范围重叠代码并尝试了所有方法,但似乎没有任何效果。

有任何想法吗?

Rap*_*aus 3

你不能简单地做

var doesOverlapExist = Session.QueryOver<DelegateOrderApproval>()
     .Any(x => 
        x.DateFrom > DateTime.Now && 
        delegateOrderApproval.DelegatedUser.UserId == x.DelegatorUser.UserId &&
        x.DateFrom <= delegateOrderApproval.DateTo &&
        x.DateTo >= delegateOrderApproval.DateFrom);
Run Code Online (Sandbox Code Playgroud)

或者如果您没有,请替换为

Where(x=> blabla).Count() >0
Run Code Online (Sandbox Code Playgroud)

重叠检查逻辑: 确定两个日期范围是否重叠