datetime.ToString()上的Linq where条件
我有以下Linq代码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
// 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
是必需的,并且是datetypeDateTime
,因此每一行都有值。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)