数据查询范围linq c#

问题描述:

我在我的网站上有一个日历,用户可以创建一天或多天的活动。
因此,在我的Calendar表中,我设置了两个字段Start(日期时间)和End(日期时间)。

我想要执行具有特定日期范围的查询,如从08/01/201708/31/2017
现在,我该如何处理这个范围内的所有事件?

我不得不采取:
数据查询范围linq c#

  • ,在此范围内的范围,年底前启动事件开始在这个范围内和之前或区域结束之后结束,
  • 活动,
  • 事件开始之前,该范围但毕竟这范围


到底是有可能做一个查询或我必须做三个不同的查询?

我希望我解释自己,否则问我...

+0

@勒内·沃格特:未覆盖的第三个要求。 –

+2

我会说它应该足够测试'event.End> range.Start && event.Start Fildor

+0

是的,我必须显示第三个事件,因为它经历了范围。 – Broge

我想说这应该足以测试event.End >= range.Start && event.Start <= range.End

 
     0 1 2 3 4 5 6 7 8 9 
Range  |-----| 
Evt1 |-|     evt.End < range.Start => false 
Evt2     |-|  evt.Start > range.End => false 
Evt3  |-----------|  => true 
Evt4  |-------|   => true 
Evt5    |-----|  => true 
Evt6   |-|   => true 
+1

是的。在这种简单的条件下,我采取了所有这三种类型的事件。谢谢 – Broge

+0

我向René投了赞,因为他实际上已经提出了工作代码。 – Fildor

+0

@SlavaUtesinov这是第三个条件:“在此范围之前开始但在此范围之后结束的事件” – Fildor

DateTime startRange = new DateTime(2017, 08, 01); 
DateTime endRange = new DateTime(2017, 08, 32); 

var events = db.Events 
    .Where(e => e.Start >= startRange && startRange <= e.End && e.End >= endRange 
      || e.Start <= startRange && e.End >= endRange 
      || e.Start <= startRange && endRange >= e.Start && e.End <= endRange); 

这是足够的?

+0

@RenéVogt:真的,现在:) –

+0

它虽然工作,但@Fildor方法更简单。不管怎么说,还是要谢谢你! – Broge

你的要求可以归结为以下事实:

  • 该事件的范围
  • 该事件的范围
  • 开始后 结束结束开始

(“和”很重要,否则完全超出范围的事件也会匹配)。

所以,这应该工作:

DateTime startRange = new DateTime(2017, 08, 01); 
DateTime endRange = new DateTime(2017, 08, 32); 

var events = db.Events.Where(e => e.Start <= rangeEnd && e.End >= rangeStart); 
+0

您首先得到正确的答案......谢谢! – Broge