错误Linq到实体日期时间

时间:2014-02-06 04:32:52

标签: c# sql linq entity-framework datetime

我有以下代码

var dates = query.Select(
                 x => DateTime.ParseExact(x.Date, "yyyy-MM", CultureInfo.InvariantCulture));

var minDate = dates.Min(x => x);

但是当我执行它时,我得到了异常

  

System.Data.Entity.dll但未在用户代码中处理

     

其他信息:LINQ to Entities无法识别该方法   'System.DateTime ParseExact(System.String,System.String,   System.IFormatProvider)'方法,并且此方法无法翻译   进入商店表达。

我做错了什么?我该如何解决这个问题?

4 个答案:

答案 0 :(得分:2)

嗯,错误实际上非常清楚。 Linq to PitiesExact to SQL的实体没有翻译。

请记住,Entity Framework在封面下将查询转换为SQL命令或命令集。如果EF不知道如何翻译某些内容,则会抛出此错误。

一种可能的解决方案虽然不是非常有效,但是将IQueryable转换为IEnumerable,这将允许您执行该语句。

var dates = query.ToList().Select(
             x => DateTime.ParseExact(x.Date, "yyyy-MM", CultureInfo.InvariantCulture));

答案 1 :(得分:2)

如果日期在数据库中作为字符串格式为“yyyy-MM”,那么您可以根据字符串排序进行查询并将结果转换为DateTime:

var minDateString = query.Select(x => x.Date).Min();
var minDate = DateTime.ParseExact(
    minDateString, 
    "yyyy-MM", 
    CultureInfo.InvariantCulture
);

许多系统依赖于“yyyy-MM-dd hh:mm:ss”的自然字符串排序,您可以轻松地依赖该排序的子集。

答案 2 :(得分:1)

我担心您必须将数据时间值的所有string表示从DB加载到内存中:

var dates = query.Select(x => x.Date).ToList();

并执行解析和min作为LINQ to Objects查询:

var min = query.Min(x => DateTime.ParseExact(x, "yyyy-MM", CultureInfo.InvariantCulture));

如果您的数据库设置了属性,而x.DateDateTime则可以执行以下操作:

var dates = query.Select(x => x.Date);
var min = dates.Min();

将被转换为正确的SQL查询并让MIN()由数据库计算,因此您不必将所有数据提取到应用程序内存中。

答案 3 :(得分:0)

LINQ to Entities接受您的LINQ查询并将其转换为SQL代码,然后针对数据库执行该代码。这意味着您编写的代码必须能够转换为SQL代码。无法将DateTime.ParseExact转换为SQL代码,因此异常。您需要通过调用ToArray来评估LINQ to Entities查询,然后您可以执行第二次LINQ to Objects查询,它将理解DateTime.ParseExact。