var _My_ResetSet_Array = _DB
.tbl_MyTable
.Where(x => x.Active == true
&& x.DateTimeValueColumn <= DateTime.Now)
.Select(x => x);
上层查询工作正常
但我只想检查日期值。
但是上层查询检查日期+时间值。
在传统的mssql中,我可以编写如下的查询。
SELECT * FROM dbo.tbl_MyTable
WHERE
CAST(CONVERT(CHAR(10), DateTimeValueColumn, 102) AS DATE) <=
CAST(CONVERT(CHAR(10),GETDATE(),102) AS DATE)
AND
Active = 1
所以任何人都可以给我建议我如何只检查Linq中的日期值。
答案 0 :(得分:102)
EF 6.0中还有EntityFunctions.TruncateTime
或DbFunctions.TruncateTime
答案 1 :(得分:18)
此问题的简单解决方法是仅比较日期部分
var _My_ResetSet_Array = _DB
.tbl_MyTable
.Where(x => x.Active == true &&
x.DateTimeValueColumn.Year == DateTime.Now.Year
&& x.DateTimeValueColumn.Month == DateTime.Now.Month
&& x.DateTimeValueColumn.Day == DateTime.Now.Day);
因为linq to entity不支持'Date'数据类型,因为Year,Month和Day是'int'数据类型且受支持。
答案 2 :(得分:2)
修改强>
要避免此错误:LINQ to Entities中不支持指定的类型成员“Date”。仅支持初始化程序,实体成员和实体导航属性。
var _My_ResetSet_Array = _DB
.tbl_MyTable
.Where(x => x.Active == true)
.Select(x => x).ToList();
var filterdata = _My_ResetSet_Array
.Where(x=>DateTime.Compare(x.DateTimeValueColumn.Date, DateTime.Now.Date) <= 0 );
第二行是必需的,因为LINQ to Entity无法将date属性转换为sql查询。因此,首先获取数据然后应用日期过滤器会更好。
修改强>
如果您只想比较日期时间的日期值而不是使用
DateTime.Date
Property - 获取此实例的日期组件。
代码
var _My_ResetSet_Array = _DB
.tbl_MyTable
.Where(x => x.Active == true
&& DateTime.Compare(x.DateTimeValueColumn.Date, DateTime.Now.Date) <= 0 )
.Select(x => x);
如果喜欢它,那么使用
DateTime.Compare Method - 比较两个DateTime实例,并返回一个整数,指示第一个实例是否早于,等于或晚于第二个实例。
代码
var _My_ResetSet_Array = _DB
.tbl_MyTable
.Where(x => x.Active == true
&& DateTime.Compare(x.DateTimeValueColumn, DateTime.Now) <= 0 )
.Select(x => x);
示例
DateTime date1 = new DateTime(2009, 8, 1, 0, 0, 0);
DateTime date2 = new DateTime(2009, 8, 1, 12, 0, 0);
int result = DateTime.Compare(date1, date2);
string relationship;
if (result < 0)
relationship = "is earlier than";
else if (result == 0)
relationship = "is the same time as";
else
relationship = "is later than";
答案 3 :(得分:2)
result = from r in result where (r.Reserchflag == true &&
(r.ResearchDate.Value.Date >= FromDate.Date &&
r.ResearchDate.Value.Date <= ToDate.Date)) select r;
答案 4 :(得分:1)
&& x.DateTimeValueColumn <= DateTime.Now
只要您的架构正确
,就会受到支持&& x.DateTimeValueColumn.Value.Date <=DateTime.Now
答案 5 :(得分:1)
在类似的情况下,我使用了以下代码:
DateTime upperBound = DateTime.Today.AddDays(1); // If today is October 9, then upperBound is set to 2012-10-10 00:00:00
return var _My_ResetSet_Array = _DB
.tbl_MyTable
.Where(x => x.Active == true
&& x.DateTimeValueColumn < upperBound) // Accepts all dates earlier than October 10, time of day doesn't matter here
.Select(x => x);
答案 6 :(得分:0)
工作代码:
{
DataBaseEntity db = new DataBaseEntity (); //This is EF entity
string dateCheck="5/21/2018";
var list= db.tbl
.where(x=>(x.DOE.Value.Month
+"/"+x.DOE.Value.Day
+"/"+x.DOE.Value.Year)
.ToString()
.Contains(dateCheck))
}
答案 7 :(得分:0)
尝试一下
var _My_ResetSet_Array = _DB
.tbl_MyTable
.Where(x => x.Active == true
&& x.DateTimeValueColumn <= DateTime.Now)
.Select(x => x.DateTimeValueColumn)
.AsEnumerable()
.select(p=>p.DateTimeValueColumn.value.toString("YYYY-MMM-dd");
答案 8 :(得分:0)
请勿简化代码,以免出现“ linq翻译错误”: 该测试包括一个时间为0:0:0的日期和同一时间为23:59:59的日期
iFilter.MyDate1 = DateTime.Today; // or DateTime.MinValue
// GET
var tempQuery = ctx.MyTable.AsQueryable();
if (iFilter.MyDate1 != DateTime.MinValue)
{
TimeSpan temp24h = new TimeSpan(23,59,59);
DateTime tempEndMyDate1 = iFilter.MyDate1.Add(temp24h);
// DO not change the code below, you need 2 date variables...
tempQuery = tempQuery.Where(w => w.MyDate2 >= iFilter.MyDate1
&& w.MyDate2 <= tempEndMyDate1);
}
List<MyTable> returnObject = tempQuery.ToList();
答案 9 :(得分:-4)
使用mydate.Date
仅处理DateTime类的日期部分。