Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
datetime.ToString()上的Linq where条件_Linq_Entity Framework Core - Fatal编程技术网

datetime.ToString()上的Linq where条件

datetime.ToString()上的Linq where条件,linq,entity-framework-core,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 thro

我有以下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

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

你的DateTimeColumn2可能有空值,这对于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()

如果您认为由于任何DateTimeColumn2值可能为null而引发异常,请检查是否为非null:

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)
现在,第一部分容易受到空引用异常的影响。对于
Column1
,有些实体的
null


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

您是否验证了
model.search.value
中没有任何内容是
null
DateTimeColumn2
是必需的,并且是datetype
DateTime
,因此每一行都有值。
DateTimeColumn2
DateTime
,它不可
为空。当然,我尝试了你的代码,但错误是一样的:/这很奇怪。可能是模型、搜索或值为空吗?这很有道理!非常感谢。有没有办法解决这个不受支持的
.ToString()
方法?EF core有这个功能。我还没有尝试过,但是您可以将函数映射到SQL datetime格式化函数。我尝试了
DbFunction
,但错误相同。我将使用带有附加DateTimeString列的view对象解决此问题。@Muflix(如果目标数据库是SqlServer)。添加
[DbFunction(“FORMAT”,“FORMAT”)]公共静态字符串格式(日期时间值,字符串格式)=>value.ToString(格式)m.DateTimeColumn2.ToString(“dd.MM.yyyy”)
替换为
YourDbContext.Format(m.DateTimeColumn2,“dd.MM.yyyy”)
应该可以解决这个问题(正如Gert所建议的)@IvanStoev谢谢我会尝试的,不幸的是,我使用的是不支持
格式
功能的
sql server 2008 r2
。我用自己的标量函数进行了尝试,该函数使用的是
convert
函数。
m.Column1.Contains(model.search.value)