我有以下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异常 类型“ System.NullReferenceException”发生在 Microsoft.EntityFrameworkCore.dll,但未在用户代码中处理: '你调用的对象是空的。'在 System.Linq.Enumerable.WhereSelectEnumerableIterator
2.MoveNext()
1.EnumeratorExceptionInterceptor.MoveNext()
at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ExceptionInterceptor
如果我注释掉第二列的行,那么它会起作用
//|| m.DateTimeColumn2.ToString("dd.MM.yyyy").StartsWith(model.search.value)
model.search.value
是字符串值,我正在尝试过滤所有列。 DateTimeColumn2在数据库中的DateTime数据类型中,但是用户输入了字符串,因此Iam将DateTimeColumn2转换为字符串并尝试过滤为用户值。你知道我在做什么错吗?
答案 0 :(得分:2)
这里发生的是那部分...
|| m.DateTimeColumn2.ToString("dd.MM.yyyy").StartsWith(model.search.value)
...无法转换为SQL(不支持ToString("dd.MM.yyyy")
`),因此EF核心会自动切换到客户端评估。
但是,现在整个Where
子句都在客户端进行评估,包括第一部分
m.Column1.Contains(model.search.value)
现在,第一部分变得容易出现空引用异常。有些实体的null
中有Column1
。
当您删除DateTimeColumn2
谓词时,整个语句可以转换为SQL并由数据库进行评估。
答案 1 :(得分:0)
您的DateTimeColumn2可能具有NULL值,这对于DateTime列来说是非常正常的。另外,您不应将其转换为字符串,而应将搜索值转换为日期时间。用户是否像“ 01”一样搜索表示月份和年份的第一个日期?
query = query.Where(m => m.Column1.Contains(model.search.value)
|| !m.DateTimeColumn2.HasValue
|| m.DateTimeColumn2.ToString("dd.MM.yyyy").StartsWith(model.search.value));
return query.ToList()
答案 2 :(得分:0)
如果您认为由于任何DateTimeColumn2值可能为null而引发异常,请检查是否为非null:
query = query.Where(m => ...
|| (m.DateTimeColumn2 != null &&
m.DateTimeColumn2.ToString("dd.MM.yyyy").StartsWith(model.search.value)));