C# 仅从datetimeoffset属性获取日期
我使用EF从DB查询数据,其中一个字段是datetimeoffset,我希望它的值(仅日期)与datetime对象进行比较。问题是,当我尝试entity.DbFunctions.TruncateTime时,这不会使偏移消失,因为TruncateTime返回DateTimeOffset对象。我也不能用 日期,因为它将向linq异常抛出一个实体C# 仅从datetimeoffset属性获取日期,c#,entity-framework,C#,Entity Framework,我使用EF从DB查询数据,其中一个字段是datetimeoffset,我希望它的值(仅日期)与datetime对象进行比较。问题是,当我尝试entity.DbFunctions.TruncateTime时,这不会使偏移消失,因为TruncateTime返回DateTimeOffset对象。我也不能用 日期,因为它将向linq异常抛出一个实体 entity.DbFunctions.TruncateTime(x.FromTime) == (assignmentDate) 试着用下面的方法 enti
entity.DbFunctions.TruncateTime(x.FromTime) == (assignmentDate)
试着用下面的方法
entity.DbFunctions.TruncateTime(x.FromTime).Equals(assignmentDate)
因为
=
用于object类型的表达式,它将解析为system.object.ReferenceEqualsDateTimeOffset有一个Date属性,该属性将仅日期部分作为DateTime返回,因此如下所示:
x.FromTime.Value.Date == (assignmentDate)
可能有用。但是,请记住x.FromTime和TruncateTime返回的值可以为null,因此您需要使用该值并适当地处理null。您需要将TruncateTime应用于这两个值,以获得所需的结果
x => EntityFunctions.TruncateTime (x.FromTime) == EntityFunctions.TruncateTime(assignmentDate)
当我尝试时,LINQ正在将assignmentDate转换为DateTimeOffset。即使在截断时间之后,它也会失败,因为日期具有不同的偏移量
这将生成如下所示的SQL语句
((convert (datetimeoffset, convert(varchar(255), [Extent1].[FromTime], 102) + ' 00:00:00 ' + Right(convert(varchar(255), [Extent1].[FromTime], 121), 6) , 102)) = CAST( convert (datetime2, convert(varchar(255), @p__linq__0, 102) , 102) AS datetimeoffset))
OR ((convert (datetimeoffset, convert(varchar(255), [Extent1].[FromTime], 102) + '' 00:00:00 '' + Right(convert(varchar(255), [Extent1].[FromTime], 121), 6) , 102) IS NULL)
AND (convert (datetime2, convert(varchar(255), @p__linq__0, 102) , 102) IS NULL))
请告诉我们您尝试了什么?我无法粘贴整个查询,但这是where class
entity.DbFunctions.TruncateTime(x.FromTime)==(assignmentDate)
assignmentDate是DateTime搜索字段x.FromTime是DB DateTimeOffset字段您可以尝试将assignmentDate转换为DateTimeOffset范围吗。这可能不是正确的解决方案。但要找到正确的解决方案,还有一个办法。@Vijay正在尝试samei无法在实体-LINQT中调用.Date方法。这将导致“指定的类型成员'Date'在LINQ to Entities中不受支持”异常。LINQ将assignmentDate转换为datetime偏移量以进行比较。
((convert (datetimeoffset, convert(varchar(255), [Extent1].[FromTime], 102) + ' 00:00:00 ' + Right(convert(varchar(255), [Extent1].[FromTime], 121), 6) , 102)) = CAST( convert (datetime2, convert(varchar(255), @p__linq__0, 102) , 102) AS datetimeoffset))
OR ((convert (datetimeoffset, convert(varchar(255), [Extent1].[FromTime], 102) + '' 00:00:00 '' + Right(convert(varchar(255), [Extent1].[FromTime], 121), 6) , 102) IS NULL)
AND (convert (datetime2, convert(varchar(255), @p__linq__0, 102) , 102) IS NULL))