LINQ - 从类型字符串

时间:2016-03-14 12:01:29

标签: linq linq-to-entities

我有这个LINQ查询:

  hdms = from t in db.HOLIDAY
         join t1 in db.EMPLOYEE on t.UPDATED_BY equals t1.EMP_CODE                               
         where
             t.HOLIDAY_NAME == searchtext &&                                   
             t.DOH.Value.Year == 2016
         orderby
             t.DOH
         select new HOLIDAYDETAILS
         {
             HOLIDAY_NAME = t.HOLIDAY_NAME,
             DOH = t.DOH,
             EMP_NAME = t1.EMP_NAME                                   
         };

执行此操作时,会出现以下错误:

  

'string'不包含'Value'的定义,也没有扩展方法'Value'接受类型'string'的第一个参数(你是否缺少using指令或汇编引用?)

错误来自Value中的t.DOH.Value.Year = 2016

此处t.DOH的类型为string,值为2016-04-14

我也试过这个:

       hdms = from t in db.HOLIDAY                           
                       where                               
                           DateTime.ParseExact(t.DOH, "yyyy-MM-dd", CultureInfo.InvariantCulture).Year == DateTime.Now.Year
                       orderby
                           t.DOH
                       select new HOLIDAYDETAILS
                       {                               
                           DOH = t.DOH                               
                       };

现在出现了这个错误:

  

LINQ to Entities无法识别方法'System.DateTime ParseExact(System.String,System.String,System.IFormatProvider)'方法,并且此方法无法转换为商店表达式。

在LINQ中还有其他方法可以将字符串转换为日期类型吗?

2 个答案:

答案 0 :(得分:1)

您可以从字符串中解析DateTime,如:

DateTime.ParseExact(t.DOH, "yyyy-MM-dd", CultureInfo.InvariantCulture)

然后你可以使用[DateTimeVariable]获得年份值。年份

答案 1 :(得分:1)

由于DOH是字符串类型,您可以使用StartsWith检查字符串是否以2016开头。

where
  t.HOLIDAY_NAME == searchtext &&                                   
  t.DOH.StartsWith("2016")

更好的选择是将DOH的数据类型更改为DateTime / DatetTime?,以便在处理日期和时间值时获得更好的支持。然后你可以保留你的查询。