2016-10-04 91 views
1

我想使用LINQ获取时间戳在22:30 - 24:00或00:00 - 1:00之间的实体列表周六或周日,我期待以设置一个LINQ查询这两个时间框架,但我一直未能如愿,不得不打破它,如下所示:在22:30和1:00之间的时间戳LINQ查询

weekdayNight = intervalInformations.Where(ii => ii.IntervalPeriodTimestamp.TimeOfDay >= new TimeSpan(22, 30, 0) 
                && ii.IntervalPeriodTimestamp.TimeOfDay <= new TimeSpan(23, 30, 0) 
                && ii.IntervalPeriodTimestamp.DayOfWeek != DayOfWeek.Saturday 
                && ii.IntervalPeriodTimestamp.DayOfWeek != DayOfWeek.Sunday 
                && !dates.Contains(ii.IntervalPeriodTimestamp.ToShortDateString())) 
                .OrderBy(ii => ii.IntervalPeriodTimestamp) 
                .ToList(); 


weekdayNight2 = intervalInformations.Where(ii => ii.IntervalPeriodTimestamp.TimeOfDay >= new TimeSpan(0, 0, 0) 
                && ii.IntervalPeriodTimestamp.TimeOfDay <= new TimeSpan(0, 30, 0) 
                && ii.IntervalPeriodTimestamp.DayOfWeek != DayOfWeek.Saturday 
                && ii.IntervalPeriodTimestamp.DayOfWeek != DayOfWeek.Sunday 
                && !dates.Contains(ii.IntervalPeriodTimestamp.ToShortDateString())) 
                .OrderBy(ii => ii.IntervalPeriodTimestamp) 
                .ToList(); 

weekdayNight.Add(weekdayNight2); 

我怎么能写这样的查询,而无需加入两个不同的查询

回答

2

在定义时间间隔的两个条件之间添加一个OR应该诀窍:

weekdayNight = intervalInformations.Where(ii => 
    ((ii.IntervalPeriodTimestamp.TimeOfDay >= new TimeSpan(22, 30, 0) && ii.IntervalPeriodTimestamp.TimeOfDay <= new TimeSpan(23, 30, 0)) 
|| (ii.IntervalPeriodTimestamp.TimeOfDay >= new TimeSpan(0, 0, 0) && ii.IntervalPeriodTimestamp.TimeOfDay <= new TimeSpan(0, 30, 0))) 
    && ii.IntervalPeriodTimestamp.DayOfWeek != DayOfWeek.Saturday 
    && ii.IntervalPeriodTimestamp.DayOfWeek != DayOfWeek.Sunday 
    && !dates.Contains(ii.IntervalPeriodTimestamp.ToShortDateString()) 
) 
.OrderBy(ii => ii.IntervalPeriodTimestamp) 
.ToList(); 

注:您的查询似乎排除了23:30和午夜之间的最后半小时。如果这不是故意的,则可以进一步简化查询:

weekdayNight = intervalInformations.Where(ii => 
    (ii.IntervalPeriodTimestamp.TimeOfDay >= new TimeSpan(22, 30, 0) 
|| ii.IntervalPeriodTimestamp.TimeOfDay <= new TimeSpan(0, 30, 0)) 
    && ii.IntervalPeriodTimestamp.DayOfWeek != DayOfWeek.Saturday 
    && ii.IntervalPeriodTimestamp.DayOfWeek != DayOfWeek.Sunday 
    && !dates.Contains(ii.IntervalPeriodTimestamp.ToShortDateString()) 
) 
.OrderBy(ii => ii.IntervalPeriodTimestamp) 
.ToList();