在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)’方法,并且此方法无法转换为商店表达式。

我想如何将字符串转换为日期和时间并检查今天的日期

我不知道如你所描述的那样实现它的方法,因为

  1. SQL中没有函数可以通过不等式过滤字符串格式的日期(至少那些与日期格式一起使用并且可以从LINQ转换为SQL查询的日期)。
  2. 您的数据库设计存在缺陷,导致“正常”方法无法正常工作

但是,有一些可能的解决方法

  1. 修改数据库,使日期为实际日期时间格式(最佳选项,但当然有时不可用)
  2. 创建存储过程以实现相同的目标。 在SQL代码中,您可以使用日期解析
  3. 查询修改如下:

(码)

 // 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.ToDateTimeGetValueOrDefault()

但是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);