Linq where 条件 datetime.ToString()
Linq where condition on 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 错误
Exception has occurred: CLR/System.NullReferenceException An exception
of type 'System.NullReferenceException' occurred in
Microsoft.EntityFrameworkCore.dll but was not handled in user code:
'Object reference not set to an instance of an object.' at
System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext()<br>
at
Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ExceptionInterceptor
1.EnumeratorExceptionInterceptor.MoveNext()
如果我注释掉第 2 列的行,它会起作用
//|| m.DateTimeColumn2.ToString("dd.MM.yyyy").StartsWith(model.search.value)
model.search.value
是字符串值 我正在尝试过滤所有列。 DateTimeColumn2 是数据库中的 DateTime 数据类型,但用户输入的是字符串,因此我将 DateTimeColumn2 转换为字符串并尝试过滤为用户值。知道吗,我做错了什么?
您的 DateTimeColumn2 可能有 NULL 值,这对于 DateTime 列来说是很正常的。此外,您不应将其转换为字符串,而应将搜索值转换为日期时间。用户搜索的“01”是否表示任何月份的任何第一个日期and\year?
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()
如果您认为抛出异常是因为任何 DateTimeColumn2 值可能为空,请检查非空性:
query = query.Where(m => ...
|| (m.DateTimeColumn2 != null &&
m.DateTimeColumn2.ToString("dd.MM.yyyy").StartsWith(model.search.value)));
这里发生的是部分...
|| 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
对应 Column1
。
当您删除 DateTimeColumn2
谓词时,整个语句可以翻译成 SQL 并由数据库评估。
我有以下 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 错误
Exception has occurred: CLR/System.NullReferenceException An exception of type 'System.NullReferenceException' occurred in Microsoft.EntityFrameworkCore.dll but was not handled in user code: 'Object reference not set to an instance of an object.' at System.Linq.Enumerable.WhereSelectEnumerableIterator
2.MoveNext()<br> at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ExceptionInterceptor
1.EnumeratorExceptionInterceptor.MoveNext()
如果我注释掉第 2 列的行,它会起作用
//|| m.DateTimeColumn2.ToString("dd.MM.yyyy").StartsWith(model.search.value)
model.search.value
是字符串值 我正在尝试过滤所有列。 DateTimeColumn2 是数据库中的 DateTime 数据类型,但用户输入的是字符串,因此我将 DateTimeColumn2 转换为字符串并尝试过滤为用户值。知道吗,我做错了什么?
您的 DateTimeColumn2 可能有 NULL 值,这对于 DateTime 列来说是很正常的。此外,您不应将其转换为字符串,而应将搜索值转换为日期时间。用户搜索的“01”是否表示任何月份的任何第一个日期and\year?
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()
如果您认为抛出异常是因为任何 DateTimeColumn2 值可能为空,请检查非空性:
query = query.Where(m => ...
|| (m.DateTimeColumn2 != null &&
m.DateTimeColumn2.ToString("dd.MM.yyyy").StartsWith(model.search.value)));
这里发生的是部分...
|| 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
对应 Column1
。
当您删除 DateTimeColumn2
谓词时,整个语句可以翻译成 SQL 并由数据库评估。