【问题标题】:Date range overlap issue in LINQLINQ 中的日期范围重叠问题
【发布时间】:2012-08-29 18:51:32
【问题描述】:

给定表格中特定记录的日期范围,例如特定字段“名称”

如果有人试图在之前的日期范围内插入该名称,则不应允许。

我在这里试过一些代码看看这个...

if (dataContext.TableAs.Where(
    x => x.EndDate > StartDate &&
    x.Name == Name).Count() == 0)
{
    //insert record
}

但并非总是成功。

谁能建议我在这里错过了什么?

我已经在 SQL 中尝试了以下查询,我如何在 LINQ 中将其用于上述代码

SELECT COUNT(*) FROM TableA WHERE ('2012-04-02' between StartDate and EndDate or '2012-08-28' 
between StartDate and EndDate or StartDate between '2012-04-02' and  '2012-08-28' or       EndDatebetween '2012-04-02' and  '2012-08-28' ) and Name='Test'

【问题讨论】:

  • 查看我对您问题第二部分的编辑
  • 你能澄清一下吗?如果存在 2 条记录 Begin=2012-01-01,End=2012-01-31Begin=2012-03-01,End=2012-03-05 是否允许添加 Begin=2012-02-01,End=2012-02-05
  • 是允许的,如果您考虑 Begin=2012-01-05,End=2012-02-05 则不允许
  • 在这种情况下,您可以将 between 子句简化为 '2012-04-02' <= EndDate and '2012-08-28' >=StartDate。然后查看我对适当 linq 的回答

标签: c# linq


【解决方案1】:

试试这个;

if (dataContext.TableAs
            .Where(x => x.Name == Name)
                .Max(x  => x.EndDate) < StartDate)

编辑 - 问题的第二部分

DateTime Date1 = new DateTime("2012-04-02");
DateTime Date2 = new DateTime("2012-08-28");

var query = (dataContext.TableAs
            .Where(x => x.Name == "Test")
            .Where(x => (x.StartDate >= Date1 && Date1 <= x.EndDate)
                    || (x.StartDate >= Date2 && Date2 <= x.EndDate)
                    || (Date1 >= x.StartDate && x.StartDate <= Date2)
                    || (Date1 >= x.EndDate && x.EndDate <= Date2))).Count();

【讨论】:

  • 使用Any 而不是Count
【解决方案2】:
var StartDate = new DateTime(2012,04,02);
var EndDate = new DateTime(2012,08,28);
var Name = "Test";

if (!dataContext.TableAs.Any(
   x=> x.Name == Name && x.EndDate >= StartDate && x.StartDate <= EndDate
)
{
    //insert record
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多