【问题标题】:Overlapping records between two dates using Linq使用 Linq 在两个日期之间重叠记录
【发布时间】:2012-09-19 06:02:53
【问题描述】:

在我的应用程序中,用户可以委托其他用户批准订单。

我需要验证的是,没有循环引用,所以如果User A 已在一定时期内委托User BUser B 在该时期内的任何时间都不能委托User A,即是重叠的(dd/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

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

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

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

Delegator: User B
Delegated  To: User A
Date From: 15/11/2012
DateTo:    21/11/2012

应该没有冲突,因为User B 在那个时间段内不是User A 的代表?它在 12 月创下纪录。

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

有什么想法吗?

【问题讨论】:

  • 我猜你正在使用 NHibernate 的 QueryOver,你的检查应该在数据库级别运行吗?如果是,我认为您应该使用一些与 NHibernate 相关的标签来标记问题,因为这可能会影响您执行此操作的方式。

标签: c# linq date


【解决方案1】:

你就不能这样做

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

如果没有,请替换为

Where(x=> blabla).Count() >0

重叠检查逻辑: Determine Whether Two Date Ranges Overlap

【讨论】:

  • 是的,做到了。以为我把它复杂化了!!非常感谢拉斐尔!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
  • 2019-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多