【发布时间】:2011-02-13 22:23:01
【问题描述】:
我在 SQL 中有一个示例,如何在 Linq to Entity 中使用相同的逻辑?
SELECT * FROM TABLE WHERE DATE BETWEEN STARTDATE AND ENDDATE
【问题讨论】:
标签: .net linq linq-to-entities
我在 SQL 中有一个示例,如何在 Linq to Entity 中使用相同的逻辑?
SELECT * FROM TABLE WHERE DATE BETWEEN STARTDATE AND ENDDATE
【问题讨论】:
标签: .net linq linq-to-entities
我假设是 C#。
DateTime startDate=bla;
DateTime endDate=blabla;
using(var db=new MyDataContext())
{
var filteredData=db.TABLE.Where(t => t.DATE > startDate && t.DATE < endDate);
//...
}
【讨论】:
>= 和<= 得到与BETWEEN 相同的结果。
= 跳过endDate 的所有记录。你能猜到吗..?为什么会发生这种情况..?
t.DATE >= startDate && t.DATE < endDate,其中endDate 已经添加了额外的一天。否则你不会得到最后一个日期的任何东西(因为一个日期实际上是当天上午 12 点,所以小于或等于上午 12 点的某个日期实际上在它期间没有任何东西,只有在它之前。)
您会希望它在开始日期包含在内,但在结束日期不包含。这是因为用作日期的 DateTime 确实是当天的开始,并且不会延伸到一天的结束。
// dates that are inclusive on the date range
var startDate = new DateTime(2016, 1, 1);
var endDate = new DateTime(2016, 12, 31);
...
// WRONG: this will ignore data on the last day
.Where(obj => obj.StartDate >= startDate && obj.EndDate <= endDate)
// RIGHT: this will include the last day
var endDateExclusive = endDate.AddDays(1);
...
.Where(obj => obj.StartDate >= startDate && obj.EndDate < endDateExclusive)
即使您使用特定的DateTime 值,使用>= 和< 仍然很重要,而不是>= 和<= 或> 和<。
如果您同时使用 >= 和 <= 符号,则从 X 到 Y 和从 Y 到 Z 的两个日期范围都将包含与 Y 完全匹配的记录。根据您的要求,包含它可能是一个严重的缺陷两个日期范围内的记录。同样,如果您使用 > 和 <,您将改为排除两个日期范围内与 Y 完全匹配的记录。
【讨论】: