【问题标题】:LINQ to Entities formatting date exception [duplicate]LINQ to Entities 格式化日期异常 [重复]
【发布时间】: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 上奏效了吗?

标签: c# entity-framework linq


【解决方案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
猜你喜欢
  • 2011-08-15
  • 2015-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-20
  • 1970-01-01
  • 2011-12-21
  • 1970-01-01
相关资源
最近更新 更多