1

我需要根据日期范围获取数据,例如:

SELECT * FROM MyTable WHERE 
myDate >= 'May 17 2012' AND 
myDate <= 'May 17 2012'

我已经在 LINQ 中编写了这个查询,问题是 LINQ 正在将此查询转换为:

SELECT * FROM MyTable WHERE 
myDate >= 'May 17 2012 12:00:00:000AM' AND 
myDate <= 'May 17 2012 12:00:00:000AM'

问题是 LINQ 也在考虑时间部分,但我只需要搜索日期部分。

谁能帮我?

谢谢。

4

4 回答 4

8

只是想与您分享我找到了解决方案!

EntityFunctions 为我们提供了 TruncateTime(),可以用于此目的。

EntityFunctions.TruncateTime

 from e in MyContext.MyTable.Where(a =>
 EntityFunctions.TruncateTime(a.DateTimeColumn) ==   
 EntityFunctions.TruncateTime(DateTime.Now))  select e;

编辑: 对于 EntityFramework 6 及更高版本:

 from e in MyContext.MyTable.Where(a =>
 DbFunctions.TruncateTime(a.DateTimeColumn) ==   
 DbFunctions.TruncateTime(DateTime.Now))  select e;

我在这里找到了。

于 2012-09-12T09:27:59.387 回答
1

我今天也在寻找这个答案 - 在这里找到它 Comparing Dates in Linq To SQL

我还仔细检查了探查器,以确保将其转换为 SQL

from e in MyContext.MyTable.Where(a => a.DateTimeColumn.Date == DateTime.Now.Date)
select e;
于 2012-06-12T01:18:01.787 回答
0

你有两个选择

from t in context.MyTable
where t.MyDate <= maxDate.AddDays(1)
select t

或者

from t in context.MyTable
where t.MyDate.Date <= maxDate.Date
select t

第一个可能会提供更好的性能,因为第二个可能无法正确使用您的数据库索引。但第二个在意图上更明显。

于 2012-05-18T05:59:32.187 回答
0

您实际上并不仅仅按日期部分搜索;幕后那个日期是一个DateTime。因此,要获得一天的行数,请这样想:

我想获取MyDate大于或等于 5 月 17 日午夜且小于 5 月 18 日午夜的所有行。

下面的查询就是这样做的。

var startDate = new DateTime(2012, 05, 17);
var endDate = new DateTime(2012, 05, 18);
var result = 
from row in context.MyTable
where row.MyDate >= startDate &&
      row.MyDate < endDate
select row;
于 2012-05-18T09:35:48.340 回答