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.ExceptionInterceptor1.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 并由数据库评估。