使用日期作为过滤器使用linq检索数据的逻辑

时间:2016-06-23 10:06:53

标签: c# linq

我现在正在制定逻辑,使用linq从数据库中检索数据,但我真的不知道如何做逻辑。

这是方案

我需要检索本月一周内发生的所有事件。

(仅举例)

我们假设一周从1/15/2016开始,到1/21/2016

结束

然后是数据

------------------------------
Starts         |  Ends
------------------------------
1/1/2016       | 1/31/2016
1/16/2016      | 1/17/2016
1/1/2016       | 1/16/2016
1/18/2016      | 1/30/2016
1/1/2016       | 1/14/2016
1/22/2016      | 1/31/2016

因此,如果您根据数据和周输出应

------------------------------
Starts         |  Ends
------------------------------
1/1/2016       | 1/31/2016
1/16/2016      | 1/17/2016
1/1/2016       | 1/16/2016
1/18/2016      | 1/30/2016

因为数据的任何日期属于过滤器值,即周

任何人都可以帮我搞清楚。我很高兴听到你们的任何想法。如果我的问题不是那么清楚就发表评论。

我现在正在使用linq而我只使用>=<=,但我认为情况太独特或者我不仅仅习惯了它。

5 个答案:

答案 0 :(得分:4)

你要求那些活跃的项目在这一周,你正在寻找:

query.Where(x.EndData >= weekStartDate && x.StartDate <= weekEndDate)

即如果它已经结束并且在本周结束时开始,那么在一周内某些事情是活跃的。根据您的结束日期是包含性的还是排他性的(即如果某些事情在星期五结束,它会在周五的开始或结束时结束)您可能会将>=更改为>

答案 1 :(得分:2)

 eventsCollection.Where(!(x.enddate <= startdate || x.startdate >= enddate))

排除eventenddate小于startdate或事件startdate大于提供的enddate的所有事件。

答案 2 :(得分:1)

tv2Events.Where(h => (h.Start <= weekStart && h.End >= weekEnd) || //the period include the whole week
                     (h.Start >= weekStart && h.Start <= weekEnd)  || //the period start is in the week
                     (h.End  >= weekStart && h.End <= weekEnd)) // the period end is in the week

答案 3 :(得分:1)

你应该结合两个运营商,假设:

   DateTime firstDayOfTheWeek = GetMyFirstDay();
   DateTime lastDayOfTheWeek = GetMyLastDay();

   var result = eventsCollection.Where
(x => (x.endDate >= firstDayOfWeek && x.endDate <= lastDayOfTheWeek) 
|| 
(x.startDate <= lastDayOfTheWeek && x.startDate >= firstDayOfTheWeek))

您需要解决3种可能的情况:

  • 在firstDayOfTheWeek之前开始,在lastDayOfTheWeek之前结束
  • 在一周内开始,在
  • 之后结束
  • 在一周内开始和结束

你可以基本上减少到:

  • startDate必须在一周内
  • endDate必须在一周内

这当然假设您正在处理正确的数据(即没有事件在它应该结束后开始)

答案 4 :(得分:0)

由于存在一些约束startTime < endTimeweek.Start < week.End,因此您必须查找具有条件的事件:(startTime <= week.Start AND endTime >= week.Start) OR (startTime >= week.Start AND startTime <= week.End)