Linq datetime.ToString()上的条件

时间:2018-08-02 11:17:58

标签: linq entity-framework-core

我有以下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()
at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ExceptionInterceptor
1.EnumeratorExceptionInterceptor.MoveNext()

如果我注释掉第二列的行,那么它会起作用

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

model.search.value是字符串值,我正在尝试过滤所有列。 DateTimeColumn2在数据库中的DateTime数据类型中,但是用户输入了字符串,因此Iam将DateTimeColumn2转换为字符串并尝试过滤为用户值。你知道我在做什么错吗?

3 个答案:

答案 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)));