J'ai deux valeurs de date, l'une déjà stockée dans la base de données et l'autre sélectionnée par l'utilisateur à l'aide de DatePicker. Le cas d'utilisation est de rechercher une date particulière dans la base de données.
La valeur précédemment entrée dans la base de données a toujours une composante d'heure de 12:00:00, alors que la date entrée à partir du sélecteur a une composante d'heure différente.
Je ne suis intéressé que par les composants de date et je voudrais ignorer le composant de temps.
Quelles sont les façons de faire cette comparaison en C #?
Aussi, comment faire cela dans LINQ?
MISE À JOUR: sur LINQ to Entities, ce qui suit fonctionne correctement.
e => DateTime.Compare(e.FirstDate.Value, SecondDate) >= 0
c#
linq
entity-framework
linq-to-entities
datetime-comparison
crayons de couleur
la source
la source
Réponses:
REMARQUE: au moment de la rédaction de cette réponse, la relation EF n'était pas claire (qui a été modifiée dans la question après avoir été écrite). Pour une approche correcte avec EF, vérifiez la réponse de Mandeeps .
Vous pouvez utiliser la
DateTime.Date
propriété pour effectuer une comparaison de date uniquement.la source
EntityFunctions.TruncateTime
semble certainement être la voie à suivre ces jours-ci (il est devenu disponible dans .NET 4 qui a été publié l'année après que cette question a été posée).Utilisez la classe
EntityFunctions
pour découper la partie temporelle.Source: http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/84d4e18b-7545-419b-9826-53ff1a0e2a62/
METTRE À JOUR
À partir d'EF 6.0 et versions ultérieures, EntityFunctions est remplacé par DbFunctions .
la source
EntityFunctions
a été déconseillée au profit deSystem.Data.Entity.DbFunctions
pour (au moins) EF6. C'était peut-être plus tôt que ça.Je pense que cela pourrait vous aider.
J'ai fait une extension car je dois comparer les dates dans des référentiels remplis de données EF et donc .Date n'était pas une option car il n'est pas implémenté dans la traduction LinqToEntities.
Voici le code:
alors vous pouvez l'utiliser de cette manière.
la source
Si vous utilisez la
Date
propriété pour les entités DB, vous obtiendrez une exception:Vous pouvez utiliser quelque chose comme ceci:
la source
Pour le faire dans LINQ to Entities, vous devez utiliser les méthodes prises en charge :
Moche, mais ça marche, et c'est fait sur le serveur DB.
la source
Voici une manière différente de le faire, mais ce n'est utile que si SecondDate est une variable que vous passez:
Je pense que ça devrait marcher
la source
DateTime = x.Date;
me manquait. Si j'utilisaisvar
ou avais la valeur en ligne dans la comparaison, cela échouait avec l'exception signalée. Merci.e.FirstDate.Value <= endDate
en,e.FirstDate.Value < endDate
vous pouvez supprimer le fichier.AddTicks(-1)
.Vous pouvez également utiliser ceci:
DbFunctions.DiffDays(date1, date2) == 0
la source
vous pouvez utiliser la méthode DbFunctions.TruncateTime () pour cela.
la source
Comparez toujours la propriété Date de DateTime, au lieu de la date complète.
Lorsque vous effectuez votre requête LINQ, utilisez date.Date dans la requête, c'est-à-dire:
la source
candidate.Date >= base.Date
. Théoriquement, l'candidate.Date
heure doit être> = 12:00:00, donc l'utilisation de la propriété Date est redondante, mais je m'en tiendrai aux conseils de Reed.C'est comme ça que je fais ça.
la source
// Remarque pour les utilisateurs / codeurs Linq
Cela devrait vous donner la comparaison exacte pour vérifier si une date tombe dans la plage lorsque vous travaillez avec l'entrée d'un utilisateur - sélecteur de date par exemple:
où startdate et enddate sont des valeurs d'un sélecteur de date.
la source
Sans le temps, essayez comme ceci:
la source
Vous pouvez utiliser le lien ci-dessous pour comparer 2 dates sans heure:
la fonction Compare renvoie 3 valeurs différentes: -1 0 1 ce qui signifie dt1> dt2, dt1 = dt2, dt1
la source
Essayez ceci ... Cela fonctionne bien pour comparer les propriétés Date entre deux types DateTimes:
PS. C'est une solution provisoire et une très mauvaise pratique, ne doit jamais être utilisée quand on sait que la base de données peut apporter des milliers d'enregistrements ...
la source