我有这个查询
return plannerDb.IndividualCalendars.Where(u =>
u.UserId == userId &&
u.StartDate.Date >= startDate &&
u.EndDate.Date <= endDate)
基本上这个查询的作用就是查找从该月的开始到该月末的所有日历事件。
但是,这并未考虑此
等事件Start Date: 12/26/2009 12:00:00 AM
End Date: 1/8/2010 12:00:00 AM
所以今天是12月30日。我的日历显示从11月29日到1月8日。
所以这个活动将在本月展出。然而,下个月1月到来时它将显示从12月27日到2月6日。
现在由于开始日期不在此范围内,它将忽略此事件而不显示它。
所以我需要一种方法来展示这些类型的事件,但同时只收集所需的事件。
我总是可以从他们拥有的用户那里得到每一个事件,但我认为这是一种浪费,因为我将不得不循环并对其进行排序。
所以我只想要显示的记录。
所以你可以看到我正在使用linq。
由于
答案 0 :(得分:1)
如果我正确理解您的要求,您只需要与间隔[startdate, endDate
]重叠的事件。如果这是正确的,这将为您做到:
plannerDb.IndividualCalendars.Where(
u => u.UserId == userId &&
(u.StartDate.Date < startDate && (
(u.StartDate.Date >= startDate && u.StartDate.Date <= startDate) ||
(u.EndDate.Date >= endDate && u.EndDate.Date <= endDate) ||
(u.StartDate.Date <= startDate && u.EndDate.Date >= endDate)
)
);
基本上,您只需要知道u.StartDate.Date
或[startDate, endDate]
中的u.EndDate.Date
是[startDate, endDate]
中的[u.StartDate.Date, u.EndDate.Date]
还是[startDate, endDate]
包含plannerDb.IndividualCalendars.Where(
u => u.UserId == userId &&
!(u.StartDate.Date > endDate || u.EndDate.Date < startDate)
);
endDate
}。也许更简单的表达方式是:
startDate
也就是说,事件无法在plannerDb.IndividualCalendars.Where(
u => u.UserId == userId &&
(u.StartDate.Date <= endDate && u.EndDate.Date >= startDate)
);
之后或endDate
之前结束。等价地:
startDate
最后一个版本是最清晰的。它说事件必须在{{1}}之前开始,在{{1}}之后结束。
答案 1 :(得分:0)
听起来你只想稍微改变一下这个问题
return plannerDb.IndividualCalendars.Where(u => u.UserId == userId
&& (
(startDate <= u.StartDate.Date && endDate >= u.StartDate) // Is start date in range
|| (startDate <= u.EndDate.Date && endDate >= u.EndDate) // Is end date in range
|| (startDate > u.StartDate.Date && endDate < u.EndDate) // Is range within start/end
)
)
我认为这会解决它,除非我犯了一个小错误。
答案 2 :(得分:0)
return plannerDb.IndividualCalendars.Where(u =&gt; u.UserId == userId&amp;&amp; u.StartDate.Date&lt; = endDate&amp;&amp;(u.StartDate.Date&gt; = startDate || u .EndDate.Date&gt; = startDate)