Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何在LINQ to实体中的两个日期之间搜索?_.net_Linq_Linq To Entities - Fatal编程技术网

.net 如何在LINQ to实体中的两个日期之间搜索?

.net 如何在LINQ to实体中的两个日期之间搜索?,.net,linq,linq-to-entities,.net,Linq,Linq To Entities,我在SQL中有一个例子,如何在Linq to实体中使用相同的逻辑 SELECT * FROM TABLE WHERE DATE BETWEEN STARTDATE AND ENDDATE 我假设是C DateTime startDate=bla; DateTime endDate=blabla; 使用(var db=new MyDataContext()) { var filteredData=db.TABLE.Where(t=>t.DATE>startDate&&t.DATEobj.Sta

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

SELECT * FROM TABLE WHERE DATE BETWEEN STARTDATE AND ENDDATE 
我假设是C

DateTime startDate=bla;
DateTime endDate=blabla;
使用(var db=new MyDataContext())
{
var filteredData=db.TABLE.Where(t=>t.DATE>startDate&&t.DATE
您希望它在开始日期是包含的,但在结束日期是独占的。这是因为用作日期的
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)
//日期范围中包含的日期
var startDate=新日期时间(2016,1,1);
var endDate=新的日期时间(2016年12月31日);
...
//错误:这将忽略最后一天的数据
其中(obj=>obj.StartDate>=StartDate和&obj.EndDate obj.StartDate>=StartDate和&obj.EndDate

即使您正在使用特定的
日期时间
值,使用
=
=
=
使用
=
也很重要,正是因为这个原因,我从不在两者之间使用。我更喜欢另一种形式的明确性。对我来说,这不起作用,导致LINQ出现实体错误。我也在使用DBContext@CraigStuntz即使添加
=
也会跳过
endDate
的所有记录。你能猜到吗。。?为什么会发生这种情况?@shashwat要实际获取两个日期之间的值,我想您实际上需要
t.DATE>=startDate&&t.DATE
,其中
endDate
增加了一天。否则,您将无法获得最后一个日期的任何信息(因为那天的日期实际上是上午12点,所以小于或等于上午12点,某些日期在这段时间内实际上没有任何信息,只有在这段时间之前)。添加一整天可能会导致一些意想不到的问题,对我来说,这听起来像是代码气味。事实上,当您在日期之间搜索时,大多数情况下您都希望从开始日期的第一秒搜索到结束日期的最后一秒。示例:从“2020-12-20 00:00:00.000”到“2020-12-20 23:59:59.999”搜索一整天。@leoap您可以通过构造“2020-12-20 23:59:59.999”结束日期日期时间值来完成,是的,但是搜索<2020-12-21具有相同的效果,如果您只是处理日期而不是时间,则更有意义。正确的搜索是
startDate>=2020-12-20&&endDate<2020-12-21
,它会在一天内查找数据。注意,结束日期是排他性的,而不是包容性的。我理解你的意思,但我的评论的重点是在日期上加上一整天,而不是比较方法本身。如果一个日期恰好是“2020-12-20 03:45:57”,那么加上一整天就会导致它是“2020-12-21 03:45:57”,这可能会导致意外的行为。@leoap ok,但您的意思是,如果开始时间戳有意外的时间值,那么结束时间戳也会有意外的时间值。当然,如果你用错误的数据进行计算,你最终会得到错误的数据。关键是以“日期”datetime值作为结束日期。为“2020-12-21 0:00:00”创建一个精确的日期时间不会使您的示例更加正确。在我的示例中,我创建了一个新的DateTime,然后在其中添加了1天,这将不会有任何意外的时间值。(在我自己的代码中,我实际上使用了一个自定义日期结构。)如果总是创建日期对象,可以。但是如果日期来自另一个来源,仅仅增加一整天是危险的。我就是这么说的。
// 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)