Linq-to-SQL仅搜索日期的DATE部分

时间:2012-05-18 05:50:50

标签: sql-server-2008 linq-to-sql date comparison

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

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 个答案:

答案 0 :(得分: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;

我发现它here

答案 1 :(得分:1)

您实际上并没有按日期部分搜索 ;在幕后,日期是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;

答案 2 :(得分:1)

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

我还使用分析器仔细检查以确保将其转换为SQL

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

答案 3 :(得分: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

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