【问题标题】:Get range of dates for movie rental获取电影租借日期范围
【发布时间】:2015-09-07 10:49:46
【问题描述】:

我有一个电影租借应用程序。公司将输入电影租借日期和电影租借结束日期。日期可以重叠(因为您可以有很多客户)。数据库中的数据存储为

RecordID    FromRentDate            ToRentDate
   1      2016-10-06 18:00:00.000   2016-10-06 20:00:00.000
   2      2015-10-06 18:00:00.000   2015-10-06 20:00:00.000 
   3      2015-09-29 16:00:00.000   2015-09-30 17:00:00.000 
   4      2015-09-11 00:00:00.000   2015-09-11 00:00:00.000 
   5      2015-09-09 10:00:00.000   2015-09-09 14:30:00.000 

当用户选择一个日期(使用标准 .Net 控件)时,会调用以下代码

        IEnumerable<Event> LiveDates = DataContext.Events.Where(d => d.StartDate.Value >= DateTime.Now);
        IEnumerable<DateTime> AllLiveDates = null;

        if (LiveDates != null && LiveDates.Count() > 0)
        {
            DateTime FromRentDate = LiveDates.Where(f => f.StartDate.HasValue).Min(f => f.StartDate).Value;
            DateTime ToRentDate = LiveDates.Where(t => t.EndDate.HasValue).Max(f => f.EndDate).Value;

            AllLiveDates = Enumerable.Range(0, int.MaxValue)
                         .Select(x => FromRentDate.Date.AddDays(x))
                         .TakeWhile(x => x <= ToRentDate.Date)
                         .Where(x => DataContext.Events.Any(c => x >= c.StartDate && x <= c.EndDate));
        }

        return AllLiveDates.ToList();

我想要发生的是,当用户选择一个日期时,它会获取从所选日期到结束日期的所有日期,包括电影也上映的任何包含日期,因此如果我选择,请使用上述数据今天的日期我应该取回所有记录,日期应列为:

2015-09-09
2015-09-11
2015-09-29
2015-09-30
2015-10-06 .... etc

注意2015-09-292015-09-30 是如何包含在内的,但2015-09-30 不是开始日期。这是因为这部电影的租借时间为 2 天(9 月 29 日至 30 日)。

我在使用上述代码时遇到的问题是它只返回 1 个日期。调试它似乎进入了 AllLiveDates 代码,有些东西正在删除其他日期,但不确定是什么?

【问题讨论】:

  • 跑题评论:用LiveDates.Any()替换LiveDates.Count() &gt; 0
  • 不,那没用

标签: c# asp.net linq linq-to-sql


【解决方案1】:

你可以试试这样的

var dateList = new List<DateTime>();
foreach (var ld in LiveDates)
{
    for (var dt = ld.StartDate.Date; dt <= ld.EndDate.Date; dt = dt.AddDays(1))
    {
        dateList.Add(dt);
    }
}
dateList = dateList.Distinct().ToList();
dateList = dateList.Sort((a, b) => a.CompareTo(b));

【讨论】:

  • 虽然这确实产生了该项目被保留的日期列表,但它并没有解释为什么原始代码不起作用。不错的答案。
【解决方案2】:

问题似乎是您将日期值与日期和时间进行比较。

以日期2015-09-09 为例。当您将其与表中的 DateTime 值进行比较时,您应该得到零匹配项,因为 DateTime2015-09-09 00:00:00.0000 不在任何数据点的开始和结束 DateTime 值之间。

您将需要去除数据点的时间部分,以便按照您想要的方式进行比较。幸运的是 LINQ to SQL 支持 DateTime 值的 .Date 属性,所以这应该可以工作:

试试这个:

AllLiveDates = Enumerable.Range(0, int.MaxValue)
    .Select(x => FromRentDate.Date.AddDays(x))
    .TakeWhile(x => x <= ToRentDate.Date)
    .Where(x => DataContext.Events.Any(c => x >= c.StartDate.Value.Date && x <= c.EndDate.Value.Date));

别看生成的SQL...不漂亮。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    相关资源
    最近更新 更多