2014-01-10 513 views
1

在表中,DueDate数据类型为varchar。现在,我要检查的截止日期与今天的日期在LINQ Query中,将字符串转换为datetime并检查今天的日期

var query = (from o in db.Order_Reports 
       where Convert.ToDateTime(o.ReportDueDateTime) >= DateTime.Now 
       select o); 

错误

LINQ到实体无法识别方法“的System.DateTime ToDateTime(System.String)”的方法,而这种方法无法翻译成商店表达。

我怎么想的字符串转换为日期和时间,并与今天的日期检查

+0

可能重复的[LINQ查询以将字符串转换为日期时间(http://stackoverflow.com/questions/21038960/linq-query-to-convert-string-to-datetime) – wudzik

+0

它不会按照你的描述工作......但是,可能有一种解决方法。 ReportDueDateTime列的确切格式是什么?是YYYYMMDD吗? – DarkWanderer

+0

你为什么又问这个问题?有没有你不喜欢你接受的答案?为什么'DueDate'是一个'varchar'肯定是这个问题需要解决呢? – Colin

回答

1

我不知道的方式要实现它,你描述它,因为

  1. 有没有在SQL没有的功能,将不平等过滤字符串格式的日期(至少是那些与你的日期格式工作,是可转换的LINQ to 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); 

这将是一个有点低效,但达到目的不改变DB 。将其视为临时解决方案。

0

尝试DateTime.Parse(o.ReportDueDateTime),并看看是否能工程

+0

不工作的错误 - LINQ to Entities无法识别方法System.DateTime Parse(System.String)方法,并且此方法不能被翻译成商店表达。 – Golda

+0

在Linq查询之外的情况下,声明一个字符串变量并将其设置为DateTime.Now.ToString(),然后在Linq查询中执行一个字符串比较,一个哈希位,但它应该工作。但是,如果可能的话,您应该查看将数据库列更改为DateTime。 –

+0

@StevenWood:不行,他需要> =,不只是= – DarkWanderer

-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); 
+0

'o.ReportDueDateTime'不能在LINQ语句之外被引用。 – Flater

+0

我的错,对不起。我使用动态LINQ库进行类似的任务。 – Tomcat

0

的问题是,LINQ到实体不能够转Convert.ToDateTime为有效的SQL。如果你把所有记录到内存到AsEnumerable()ToList()打电话,那么你将使用LINQ到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); 

但问题是,你可能会带来记录太多记录。但是,如果您有足够的报告是令人担忧的,那么您应该将该数据库索引放在该数据库索引上,并且您需要该索引按日期顺序排列。因此,请将该列更改为DateTime或将数据更改为可按字母顺序排序的格式 - 例如“YYYY-MM-DD-HH-mm”。然后,你可以这样做:在LINQ到实体 这种情况下happend

var query = (from o in db.Order_Reports 
      where String.Compare(ReportDueDateTime, 
            DateTime.Now.ToString("YYYY-MM-DD-HH-mm")) >= 0 
       select o); 
+0

它显示错误像运算符'>'不能应用于类型'字符串'和'字符串'的操作数 – Golda

+1

尝试'String.Compare(o.ReportDueDateTime,DateTime.Now .ToString(“YYYY-MM-DD-HH-毫米“)> = 0'而不是 –

+0

不知道你尝试过哪一个,但只是意识到'Convert.ToDateTime可能不工作,如果文化不匹配。编辑使用'ParseExact – Colin

0

是这个问题时经常DateTime的不同之处在于它是nullable

的LINQ可以理解Convert.ToDateTimeGetValueOrDefault()

但Entitie没有运动

你的手杖使用Date.Value
此代码:

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

您可以使用String.Compare。

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