2016-12-08 4 views
5

J'ai le LINQ suivant pour interroger la base de données et récupérer des produits supprimés à partir d'une date particulière.DateTime comparaison dans LINQ ne pas renvoyer des résultats corrects

return _myDbEntities.Log 
      .Where(p => p.Action.Equals("Deleted") && 
      (p.ActionDate > fromDate)) 
      .Select(p => new DeletedProduct() 
      { 
       ProductId = p.ProductId, 
       ActionDate = p.ActionDate 
      }).ToList(); 

Cependant, la requête est des valeurs retreiving comme product.ActionDate.Value = {08/12/2016 11:41:00} lorsque la fromDate était fromDate = {08/12/2016 11:41: 00 AM}

La requête indique clairement plus GRAND QUE. Que se passe-t-il ici?

+0

Vérifiez la fraction de seconde (ou affichez-la comme horodatage). Peut-être que la différence est là –

+2

Quel type est ActionDate? Pourriez-vous essayer (p.ActionDate.Value> fromDate)? –

+0

Dans la requête que vous utilisez 'product.ActionDate' mais tit semble que vous avez besoin de' product.ActionDate.Value' – Guy

Répondre

3

Il existe des fractions de seconde pour chacune de vos propriétés. Très probablement, votre enregistrement n'a pas été créé à une seconde précise, alors que tout temps créé par l'utilisateur serait défini comme tel.

Une autre possibilité est la difference between datetime and datetime2 in SQL Server.

0

Le type DateTime stocke le temps avec une précision beaucoup plus élevée que les secondes. Ils peuvent différer au niveau de la milliseconde ou même de la tique (100 nanosecondes).

Si vous voulez comparer à un niveau supérieur, essayez ceci:

(p.ActionDate.Ticks/10000000) > (fromDate.Ticks/10000000) 

10000000 est le nombre de tiques dans une seconde. Puisque le / est une division entière qui tronque la fraction, vous activez les ticks en secondes entières.

MISE À JOUR:

Il semble que vous utilisez Entity Framework. La comparaison ci-dessus ne fonctionnera probablement pas là. La solution consiste à exécuter votre requête d'origine sur la base de données, à ToList puis à filtrer à nouveau les résultats dans une requête LINQ2Objects en utilisant la logique ci-dessus.

+0

Vous ne ** ** voulez pas tirer dans une liste de tout pour faire un filtrage supplémentaire sur elle en mémoire. Selon la taille du projet, cela pourrait générer beaucoup de données supplémentaires renvoyées à partir de la base de données qui doit ensuite être analysée en objets C#. Utilise les outils que tu as (SQL Server), et laisse faire le filtrage pour toi. – krillgar

+0

@krillgar: Vous ne tirez pas une liste de tout. Vous tirez le résultat de la requête d'origine, qui effectue déjà la comparaison. Le second filtre consiste à filtrer les quelques résultats où les valeurs ne diffèrent que sur un niveau inférieur à la seconde. – Sefe

+0

OK, j'ai mal compris. Si l'OP n'a pas la possibilité de changer la base de données en une colonne 'datetime2', cela fonctionnera. Cependant, s'ils peuvent faire ce changement, vous n'auriez pas besoin de faire cela. – krillgar