繁体   English   中英

实体日期时间错误 Linq

[英]Error Linq to Entities 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)' 方法,并且此方法无法转换为存储表达式。

我究竟做错了什么? 我该如何解决?

嗯,错误其实很清楚。 Linq 中没有将 ParseExact 实体转换为 SQL。

请记住,实体框架在幕后将查询转换为 SQL 命令或命令集。 如果 EF 不知道如何翻译某些内容,则会引发此错误。

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

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

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

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

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

恐怕您必须将数据时间值的所有string表示从数据库加载到内存中:

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()由数据库计算,因此您不必将所有数据提取到应用程序内存中。

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

以您的数据库日期时间格式转换日期时间:

obj.dt = TimeZoneInfo.ConvertTimeFromUtc((DateTime)obj.dt, TimeZoneInfo.FindSystemTimeZoneById("India Standard Time"));

这是比较没有时间的日期的简单方法。 只需使用以下代码:

_DBcontext.YourModelName.AsQueryable().Where(x=> x.CREATED_DATE.Date == dt.Date).toList();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM