2012-05-18 118 views
1

我需要根据日期范围等来获取数据的唯一DATE部分:LINQ到SQL搜索日期

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也在考虑时间部分,但我只需要在日期部分搜索。

任何人都可以帮助我吗?

谢谢。

回答

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

+2

仅供参考,现在任何人都在看:对于EntityFramework 6,“EntityFunctions”已被弃用,并由“DbFunctions” – norepro

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 

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

+0

嗯。让我试试第二个对我来说OK。 –

+0

错误: LINQ to Entities不支持指定的类型成员'Date'。仅支持初始化程序,实体成员和实体导航属性。 –

1

你实际上并没有搜索只有按日期部分;幕后的那个日期是DateTime。 因此,要获得该行一天,想想它是这样的:

我想有MyDate比5月18日午夜大于或等于5月17日午夜,少的所有行。

下面的查询是这样做的。

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; 
1

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

我也是双与剖析检查,以确保它被翻译成SQL

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