首页 > 解决方案 > 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 转换为字符串并尝试过滤到用户值。任何想法,我做错了什么?

标签: linqentity-framework-coreentity-framework-core-2.1

解决方案


这里发生的是这部分......

|| m.DateTimeColumn2.ToString("dd.MM.yyyy").StartsWith(model.search.value)

...无法翻译成 SQL(ToString("dd.MM.yyyy")不支持),因此 EF-core 自动切换到客户端评估。

但是,现在整个Where子句都在客户端进行评估,包括第一部分,

m.Column1.Contains(model.search.value)

现在,这第一部分变得容易受到空引用异常的影响。有些实体具有nullfor Column1

当您删除DateTimeColumn2谓词时,整个语句可以转换为 SQL 并由数据库进行评估。


推荐阅读