在LINQ Query中将字符串转换为datetime并检查今天的日期

时间:2014-01-10 10:04:23

标签: c# linq entity-framework 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)'方法,并且此方法无法转换为商店表达式。

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

6 个答案:

答案 0 :(得分:1)

我不知道如何描述它的方法,因为

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

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

      // 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);
      

      这样效率会有点低,但可以在不更改数据库的情况下达到目的。将其视为临时解决方案。

答案 1 :(得分:0)

尝试DateTime.Parse(o.ReportDueDateTime)并查看是否有效

答案 2 :(得分:0)

问题是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);

答案 3 :(得分:0)

是的,这是Linq-to-Entities中的一个问题 这种情况发生在常规DateTime,但它是nullable

Linq可以理解Convert.ToDateTimeGetValueOrDefault()

但是Entitie没有体育

你使用 Date.Value
本代码:

var x = myContext.MyTable.Where(tbl => tbl .MyDateColumn.Value == DateTime.Now)

答案 4 :(得分:0)

您可以使用String.Compare。

var query = from o in db.Order_Reports
            where String.Compare(o.ReportDueDateTime, Now.ToString()) > 0
            select o;

答案 5 :(得分:-1)

也许这会起作用

// 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);