我需要根据日期范围获取数据,如:
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也在考虑时间部分,但我只需要搜索日期部分。
任何人都可以帮助我吗?
感谢。
答案 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
第一个可能会提供更好的性能,因为第二个可能无法正确使用数据库索引。但第二个意图更明显。