如何在LINQ to Entity中的两个日期之间进行搜索?

Hro*_*rom 24 .net linq linq-to-entities

我在SQL中有一个例子如何在Linq to Entity中使用相同的逻辑?

SELECT * FROM TABLE WHERE DATE BETWEEN STARTDATE AND ENDDATE 
Run Code Online (Sandbox Code Playgroud)

spe*_*der 33

我在假设C#.

DateTime startDate=bla;
DateTime endDate=blabla;
using(var db=new MyDataContext())
{
    var filteredData=db.TABLE.Where(t => t.DATE > startDate && t.DATE < endDate);
    //...
}
Run Code Online (Sandbox Code Playgroud)

  • 但是,使用`> =`和`<=`可以得到与`BETWEEN`相同的结果. (10认同)
  • @shashwat要实际获取两个日期之间的值,我认为您实际上需要 `t.DATE &gt;= startDate &amp;&amp; t.DATE &lt; endDate`,其中 `endDate` 添加了额外的一天。否则,您将不会获得最后一个日期的任何内容(因为日期实际上是当天的上午 12 点,因此小于或等于上午 12 点的某个日期实际上不会在该日期期间获得任何内容,仅在该日期之前获得任何内容。) (2认同)

Dav*_*eau 11

您希望它在开始日期包含在内,但在结束日期独占.这是因为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)
Run Code Online (Sandbox Code Playgroud)

即使你使用特定的DateTime值,它仍然可以使用重要的>=<,而不是>=<=><.

如果同时使用两个>=<=符号,那么从X到Y和从Y到Z的两个日期范围都将包括与Y完全匹配的记录.根据您的要求,在两个日期范围中包含记录可能是一个严重的缺陷.同样,如果您使用><,则会从与Y完全匹配的两个日期范围中排除记录.