linq - Linq where datetime.ToString() 的条件
问题描述
我有以下 Linq 代码
// query = IQueryable<DataClass>
query = query.Where(m => m.Column1.Contains(model.search.value)
|| m.DateTimeColumn2.ToString("dd.MM.yyyy").StartsWith(model.search.value));
return query.ToList() // here the error is thrown
我收到NullReferenceException错误
发生异常:CLR/System.NullReferenceException Microsoft.EntityFrameworkCore.dll 中出现“System.NullReferenceException”类型的异常,但未在用户代码中处理:“对象引用未设置为对象的实例。” 在 System.Linq.Enumerable.WhereSelectEnumerableIterator 1.EnumeratorExceptionInterceptor.MoveNext()
2.MoveNext()
at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ExceptionInterceptor
如果我注释掉第二列的行,它会起作用
//|| m.DateTimeColumn2.ToString("dd.MM.yyyy").StartsWith(model.search.value)
model.search.value
是字符串值我正在尝试过滤所有列。DateTimeColumn2 在数据库中是 DateTime 数据类型,但用户输入字符串,因此我将 DateTimeColumn2 转换为字符串并尝试过滤到用户值。任何想法,我做错了什么?
解决方案
这里发生的是这部分......
|| m.DateTimeColumn2.ToString("dd.MM.yyyy").StartsWith(model.search.value)
...无法翻译成 SQL(ToString("dd.MM.yyyy")
不支持),因此 EF-core 自动切换到客户端评估。
但是,现在整个Where
子句都在客户端进行评估,包括第一部分,
m.Column1.Contains(model.search.value)
现在,这第一部分变得容易受到空引用异常的影响。有些实体具有null
for Column1
。
当您删除DateTimeColumn2
谓词时,整个语句可以转换为 SQL 并由数据库进行评估。
推荐阅读
- ms-access - 在 Access 2016 中运行 VBA 时 IDE 冻结
- java - Kafka - 序列化异常;前导零误差
- c# - C# 进度
调用 IProgress.Report 后未调用回调 - google-analytics - 谷歌分析在 URL 后显示不需要的哈希标记
- javascript - Autodesk forge 查看器 js 依赖项存储在本地项目中
- c++ - 类似于 boost::serialization 的序列化模式
- javascript - 无法使用 router.navigate 方法或 routerlink 导航到子路由 :: 错误:无法匹配任何路由。URL 段:'child2'
- php - Ajax 多文件上传 Laravel 5.6
- javascript - 背景颜色在 HTML DOM 中有效,但在 HTML DOM 中无效
- vue.js - 根据nuxt中的url参数动态加载组件