在LINQ Query中将字符串转换为datetime并检查今天的日期
在表中,DueDate数据类型是varchar。 现在我想查看今天的截止日期
var query = (from o in db.Order_Reports where Convert.ToDateTime(o.ReportDueDateTime) >= DateTime.Now select o);
错误
LINQ to Entities无法识别方法’System.DateTime ToDateTime(System.String)’方法,并且此方法无法转换为商店表达式。
我想如何将字符串转换为日期和时间并检查今天的日期
我不知道如你所描述的那样实现它的方法,因为
- SQL中没有函数可以通过不等式过滤字符串格式的日期(至少那些与日期格式一起使用并且可以从LINQ转换为SQL查询的日期)。
- 您的数据库设计存在缺陷,导致“正常”方法无法正常工作
但是,有一些可能的解决方法
- 修改数据库,使日期为实际日期时间格式(最佳选项,但当然有时不可用)
- 创建存储过程以实现相同的目标。 在SQL代码中,您可以使用日期解析
- 查询修改如下:
(码)
// Our required date DateTime reportDate = new DateTime(2014,1,1).Date; // Let's find number of days between now and required day. Ensure that the date is not in the future! int deltaDays = (DateTime.Now.Date - date).Days; // Let's get the list of dates which we need the reports for var dates = Enumerable.Range(0, deltaDays + 1).Select(dd => DateTime.Now.Date.AddDays(-dd).ToString("MM/dd/yyyy")).ToArray(); // and query by this list var query = (from o in db.Order_Reports where o.ReportDueDateTime in dates select o);
这样效率会有点低,但可以在不更改数据库的情况下达到目的。 将其视为临时解决方案。
尝试DateTime.Parse(o.ReportDueDateTime),看看是否有效
问题是Linq-to-Entities无法将Convert.ToDateTime
转换为有效的sql。 如果通过调用AsEnumerable()
或ToList()
将所有记录带入内存,那么您将使用Linq-To-Sql,它将与C#函数一起使用:
var query = (from o in db.Order_Reports.AsEnumerable() where DateTime.ParseExact(o.ReportDueDateTime, "MM/dd/yyyy", "M/d/yyyy") >= DateTime.Now select o);
问题在于您可能会将太多记录带入内存。 但是如果您有足够的报告可以担心,那么您应该在该ReportDueDateTime
上放置数据库索引,并且您需要该索引按日期顺序排列。 因此,将该列更改为DateTime
或将数据更改为可按字母顺序排序的格式 – 如“YYYY-MM-DD-HH-mm”。 然后你可以这样做:
var query = (from o in db.Order_Reports where String.Compare(ReportDueDateTime, DateTime.Now.ToString("YYYY-MM-DD-HH-mm")) >= 0 select o);
是的,这是Linq-to-Entities中的一个问题,这种情况发生在常规DateTime,除了它可以为nullable
Linq可以理解Convert.ToDateTime
或GetValueOrDefault()
但是Entitie并没有这么做
你可以使用Date.Value
本代码:
var x = myContext.MyTable.Where(tbl => tbl .MyDateColumn.Value == DateTime.Now)
你可以使用String.Compare。
var query = from o in db.Order_Reports where String.Compare(o.ReportDueDateTime, Now.ToString()) > 0 select o;
也许这会奏效
// Make new variable in DateTime Format DateTime dateFrom = DateTime.ParseExact(o.ReportDueDateTime, "MM/dd/yyyy", CultureInfo.InvariantCulture); var query = (from o in db.Order_Reports where dateFrom >= DateTime.Now select o);