繁体   English   中英

比较 DateTime 时,FirstOrDefault 在不同的计算机上给出不同的结果? 对象

[英]FirstOrDefault giving different results on different computers when comparing DateTime? objects

我正在尝试比较 IQueryable 中的两个可为空的 DateTime 对象(从数据库中获取),如下所示:

result.FirstOrDefault(x => x.FirstDateTime == secondDateTime)

这可以在某些开发人员的计算机上正确执行,但在我的计算机上却不能。 它没有结果。 因为如果我将结果转换为这样的列表,它会起作用:

result.ToList().FirstOrDefault(x => x.FirstDateTime == secondDateTime)

当然我不想留下这样的代码,这只是为了表明它不是因为在 IQueryable 中找不到日期

两个值都是 UTC。 我尝试使用SingleSingleOrDefaultFirstWhere都具有相同的结果。 我还尝试将FirstDateTime.ValuesecondDateTime.Value进行比较。 同样的结果

IQueryable 的提供者是

System.Data.Entity.Internal.Linq.DbQueryProvider。

什么可能导致这种情况? 为什么第一段在某些计算机上有效,而在其他计算机上无效,这取决于什么?

这是正在生成的 SQL:

FROM ( SELECT 
[Extent1].[Id] AS [Id], 
[Extent1].[OtherProperty1] AS [OtherProperty1], 
[Extent1].[Version] AS [Version], 
[Extent1].[Submitted] AS [Submitted], 
[Extent1].[SubmittedBy] AS [SubmittedBy], 
[Extent1].[Created] AS [Created], 
[Extent1].[CreatedBy] AS [CreatedBy], 
[Extent2].[Value] AS [Value], 
[Extent2].[OtherProperty2] AS [OtherProperty2], 
[Extent2].[Description] AS [Description], 
[Extent2].[Latitude] AS [Latitude], 
[Extent2].[Longitude] AS [Longitude], 
[Extent2].[OtherProperty3] AS [OtherProperty3], 
[Extent2].[OtherProperty4] AS [OtherProperty4], 
[Extent2].[FirstDateTime] AS [FirstDateTime], 
''0X0X'' AS [C1]
FROM  [dbo].[StructuredInformations] AS [Extent1]
INNER JOIN [dbo].[Positions] AS [Extent2] ON [Extent1].[Id] = [Extent2].[Id]
WHERE ([Extent1].[OtherProperty1] = @p__linq__0) AND ([Extent2].
[FirstDateTime] IS NOT NULL) AND ([Extent2].[FirstDateTime] = @p__linq__1)
)  AS [Project1]
ORDER BY [Project1].[OtherProperty2] DESC, [Project1].[FirstDateTime] ASC,    
[Project1].[Value] ASC',N'@p__linq__0 int,@p__linq__1  
datetime2(7)',@p__linq__0=7,@p__linq__1='2016-10-11 11:45:53.6230000'

问题与类似 - 看起来 LINQ 提供程序生成了一个小数秒精度为 7 的日期时间值(例如 2016-10-11 11:45:53.6230000),而 SQL 中的列被定义为datetime ,它具有精度小于 7,而不是datetime2 ,它的精度可达 7

要解决此问题,您可以将 SQL 中的列类型从 datetime 更改为 datetime(7)

IQueryable不保证排序。 List<T>确实如此。 要保持IQueryable并保持顺序,您应该尝试对IQueryable进行排序,而不是尝试获得第一个结果:

result.OrderBy(y => y.FirstDateTime).FirstOrDefault(x => x.FirstDateTime == secondDateTime)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM