2015-09-07 58 views
0

我有一个电影租赁应用程序。该公司将输入电影租赁日期和电影租赁结束日期。日期可以重叠(因为您可以拥有许多客户)。在DB中的数据,当用户选择的日期(使用标准的.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(); 

我想什么发生被存储为

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 

是当用户选择一个日期,它会从选定的日期到结束日期,包括任何包含日期的结束日期,如果我选择今天的日期,我应该获取所有记录,日期应该是列为:

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

请注意2015-09-29,2015-09-30是如何包含的,但2015-09-30而不是的开始日期。这是因为这部电影租赁期限为2天(9月29日和30日)。

我遇到的问题与上面的代码是它只返回1日期。调试它似乎进入AllLiveDates代码和东西是删除其他日期,但不知道是什么?

+0

题外评论:用'LiveDates.Any()替换'LiveDates.Count()> 0' – Backs

+0

没有,没有工作 – Computer

回答

1

的问题似乎是,你是比较日期和时间的日期值。

取例如日期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 ...这是不漂亮。

2

你可以尝试这样的事情

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

虽然这实际上产生了一个日期列表保留该项目,它doesn不解释为什么原始代码不起作用。虽然不是一个错误的答案。 – Corey