LINQ to Entities 格式化日期异常 [重复]

Posted

技术标签:

【中文标题】LINQ to Entities 格式化日期异常 [重复]【英文标题】:LINQ to Entities formatting date exception [duplicate] 【发布时间】:2020-11-02 17:39:46 【问题描述】:

我收到了这个错误:

System.NotSupportedException: 'LINQ to Entities 无法识别 方法'System.String ToString(System.String)'

method,并且这个方法不能翻译成store 表达。'

代码如下:

var search = filter.getFilterValueFor("StartDate", "eq");                    
query = query.Where(it => it.it.it.ne.newWo.wo.STRT_DT.GetValueOrDefault().ToString("dd/MM/yyyy").Contains(search));
var total = query.Count();

如何解决这个错误?谢谢。

【问题讨论】:

搜索值:Thu Apr 30 2020 00:00:00 GMT+0800 OK - 这是搜索日期的错误方式。您应该创建一个DateTime 变量并填充它。然后使用query = query.Where(it => it.it.it.ne.newWo.wo.STRT_DT == yourNewDateVariable); var total = query.Count(); 添加到@mjwills 的评论中,如果需要,我建议使用DbFunctions 来操作查询。 TruncateTime 可用于在不涉及时间的情况下比较日期。 我反对亲自这样做(即,如果您想删除时间,我会检查它是否 >= 您感兴趣的一天的开始和 我的想法在@rocky3 上奏效了吗? 【参考方案1】:

IQueryable<...> 不代表相似项目的序列,它代表获得相似项目序列的潜力

为此,IQueryable 有一个Expression 和一个Provider。表达式包含必须以某种通用格式执行的查询。 Provider 知道谁必须执行查询(通常是数据库管理系统)以及使用什么语言与 DBMS 通信(通常是 SQL)。

当您开始枚举时,无论是显式使用IQueryable.GetEnumerator(),还是在更高级别使用foreach/ToList()/FirstOrDefault()/Any() 等,表达式都会发送给提供者,提供者将尝试将其转换为 SQL 并执行查询。获取的数据以IEnumerator<...> 的形式返回。

回到你的问题

您的提供者不知道方法ToString(string)。事实上,您的 Provider 不支持几种 LINQ 方法。见List of Supported and Unsupported LINQ methods (LINQ to entities)。

您还使用方法String.Contains,提供者也不会知道。即使您解决了ToString(string) 问题,您也会遇到类似的问题。

您可以做的是将原始 DateTime 格式的值传输到本地进程,然后将其转换为字符串,然后使用 Contain.使用AsEnumerable 将数据传输到本地进程。这在ToList 之上是首选,因为AsEnumerable 不会获取比您使用的更多的数据,ToList 会获取所有内容。

问题是你使用这个构造来过滤获取的数据(Where)。因此,如果您使用该解决方案,您将传输比您需要的更多的数据。

唉,您忘了提及您要查询的内容。我认为您想要获取日期“dd/MM/yyyy”的字符串版本包含“2020”或“11”的所有项目:您想要某一年的所有项目,或者 11 月的所有项目,或者可能每个月的第一天。

如果是这种情况,请考虑将 search 的值从字符串转换为您要获取的年份(或月份或日期),并使用 DateTime.Year(或月份或日期),以比较。

最后一个解决方案:使用 SQL Like。见class DbFunctions

下一次:不要给我们代码并说:“这个代码没有做我想要的”,给我们(也)描述你想要什么。

【讨论】:

Tq Mr @Harald Coppoolse

以上是关于LINQ to Entities 格式化日期异常 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

LINQ to Entities 异常中不支持指定的类型成员“日期”

将日期时间转换为 LINQ-to-entities 查询中的格式化字符串

linq to entities查询使用大于小于匹配数据库字符串日期方法

Linq to Entities 日期部分优化

LINQ to Entities 不支持指定的类型成员“日期”。 DbFunctions.TruncateTime()

如何使用 LINQ to Entities 获取字节数组长度?