获取电影租借的日期范围
Get range of dates for movie rental
我有一个电影租赁应用程序。公司将输入电影租赁日期和电影租赁结束日期。日期可以重叠(因为您可以有很多客户)。数据库中的数据存储为
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
当用户 select 设置日期(使用标准 .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();
我想要发生的是当用户 select 一个日期时,它获取从 select 编辑日期到结束日期的所有日期,包括电影所在的任何包含日期也因此使用上述数据,如果我 select 今天的日期,我应该取回所有记录并且日期应列为:
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日)。
我在使用上述代码时遇到的问题是它只有 returns 1 个日期。调试它似乎进入了 AllLiveDates 代码并且某些东西正在删除其他日期但不确定是什么?
你可以试试这样的
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));
问题似乎是您正在将日期值与日期和时间进行比较。
以日期2015-09-09
为例。当您将其与 table 中的 DateTime
值进行比较时,您应该得到零匹配,因为 DateTime
值 2015-09-09 00:00:00.0000
不在开始和结束 [=12= 之间] 任何数据点的值。
您需要去除数据点的时间部分,以便按照您希望的方式进行比较。幸运的是,LINQ to SQL 支持 .Date
属性 的 DateTime
值,所以这应该有效:
试试这个:
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...它不漂亮。
我有一个电影租赁应用程序。公司将输入电影租赁日期和电影租赁结束日期。日期可以重叠(因为您可以有很多客户)。数据库中的数据存储为
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
当用户 select 设置日期(使用标准 .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();
我想要发生的是当用户 select 一个日期时,它获取从 select 编辑日期到结束日期的所有日期,包括电影所在的任何包含日期也因此使用上述数据,如果我 select 今天的日期,我应该取回所有记录并且日期应列为:
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日)。
我在使用上述代码时遇到的问题是它只有 returns 1 个日期。调试它似乎进入了 AllLiveDates 代码并且某些东西正在删除其他日期但不确定是什么?
你可以试试这样的
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));
问题似乎是您正在将日期值与日期和时间进行比较。
以日期2015-09-09
为例。当您将其与 table 中的 DateTime
值进行比较时,您应该得到零匹配,因为 DateTime
值 2015-09-09 00:00:00.0000
不在开始和结束 [=12= 之间] 任何数据点的值。
您需要去除数据点的时间部分,以便按照您希望的方式进行比较。幸运的是,LINQ to SQL 支持 .Date
属性 的 DateTime
值,所以这应该有效:
试试这个:
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...它不漂亮。