2016-10-17 2 views
1

Je suis en train de comparer deux objets DateTime nullable (qui sont amenés à partir d'une base de données) dans un IQueryable comme suit:FirstOrDefault donnant des résultats différents sur différents ordinateurs lors de la comparaison de DateTime? objets

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

Cette exécute correctement sur les ordinateurs de certains développeurs, mais il ne le fait pas sur le mien. Cela ne donne aucun résultat. parce que si je convertir le résultat à une telle liste, cela fonctionne:

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

Bien sûr, je ne voudrais pas laisser le code comme ça, il est juste de montrer que ce n'est pas parce que la date ne peut pas être trouvé dans le IQueryable

Les deux valeurs sont UTC. J'ai essayé d'utiliser Single, SingleOrDefault, First, et Where tous avec les mêmes résultats. J'ai également essayé de comparer FirstDateTime.Value avec secondDateTime.Value. Encore une fois, même résultat

Le fournisseur pour le IQueryable est

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

Ce qui pourrait être à l'origine de cela? Comment se fait-il que le premier segment fonctionne sur certains ordinateurs, mais pas sur d'autres, sur quoi pourrait-il dépendre?

C'est le SQL qui est généré:

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' 
+0

Les commentaires ne sont pas pour une discussion prolongée; cette conversation a été [déplacée pour discuter] (http://chat.stackoverflow.com/rooms/125927/discussion-on-question-by-robert-firstordefault-giving-different-results-on-diff). –

Répondre

1

Le problème est similaire à this - ressemble le fournisseur LINQ généré une valeur datetime avec une deuxième précision fractionnelle de 7 (par exemple 2016-10-11 11: 45: 53.6230000) alors que la colonne dans SQL est définie comme datetime, qui a une précision inférieure à 7, par opposition à datetime2 qui peut avoir une précision allant jusqu'à 7

Pour travailler Autour de cela, vous pouvez changer le type de colonne dans SQL de datetime à datetime (7)

0

IQueryable ne garantit pas la commande. List<T> fait. de garder IQueryable et maintenir l'ordre que vous devriez essayer de trier IQueryable et que d'essayer d'obtenir premier résultat:

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

Merci pour votre réponse! Malheureusement ce n'est pas l'ordre qui est faux, mais qu'il ne renvoie aucune donnée – Robert

+0

j'ai vu votre mise à jour. sans cela, je pensais qu'il renvoie des valeurs différentes, pas une valeur du tout – Misiakw