Comment comparer uniquement les composants de date de DateTime en EF?
Je vais avoir deux valeurs de date, on a déjà stockées dans la base de données et l'autre choisi par l'utilisateur à l'aide de DatePicker. Le cas d'utilisation est à la recherche d'une date donnée à partir de la base de données.
La valeur précédemment saisie dans la base de données a toujours le temps de composante à 12:00:00, où, à la date de saisie de sélecteur a différents temps de la composante.
Je suis uniquement intéressé par les composants de date et souhaitez ignorer la composante temporelle.
Quels sont les moyens de faire cette comparaison en C#?
Aussi, la façon de faire dans LINQ?
Mise à JOUR:
Sur LINQ to entities, le suivant fonctionne très bien.
e => DateTime.Compare(e.FirstDate.Value, SecondDate) >= 0
- Vous pouvez également jeter un oeil à cette DONC, la question: stackoverflow.com/questions/683037/how-to-compare-dates-in-c/...
Vous devez vous connecter pour publier un commentaire.
REMARQUE: au moment de la rédaction de cette réponse, l'EF-relation n'était pas claire (qui a été édité dans la question après ce qui était écrit). Pour une bonne approche avec les objectifs EF, vérifiez Mandeeps répondre.
Vous pouvez utiliser le
DateTime.Date
propriété pour procéder à une date seule comparaison.EntityFunctions.TruncateTime
certainement semblent être la voie à suivre ces jours-ci (il est devenu disponible .NET 4, qui a été publié l'année d'après, cette question a été posée).Utiliser la classe
EntityFunctions
pour la coupe du temps de la partie.Source: http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/84d4e18b-7545-419b-9826-53ff1a0e2a62/
Mise à JOUR
Que de l'EF 6.0 et versions ultérieures EntityFunctions est remplacé par DbFunctions.
EntityFunctions
a été dépréciée en faveur deSystem.Data.Entity.DbFunctions
pour (au moins) EF6. Il peut avoir été plus tôt que cela.Je pense que cela pourrait vous aider.
J'ai fait une extension depuis que je suis à comparer des dates dans des dépôts rempli avec EF données et ainsi de .La Date n'était pas une option, car elle n'est pas implémentée dans LinqToEntities traduction.
Voici le code:
alors vous pouvez l'utiliser de cette façon.
Si vous utilisez le
Date
propriété de DB Entités, vous obtiendrez exception:Vous pouvez utiliser quelque chose comme ceci:
De le faire dans LINQ to entities, vous devez utiliser méthodes prises en charge:
Moche, mais ça fonctionne, et c'est fait sur le serveur de base de données.
Voici une autre façon de le faire, mais il est seulement utile si SecondDate est une variable que vous êtes de passage dans:
Je pense que cela devrait fonctionner
DateTime = x.Date;
j'ai été absent. Si j'ai utilisévar
, ou qui avaient de la valeur inline dans la comparaison, il a échoué à l'exception signalée. Merci.e.FirstDate.Value <= endDate
àe.FirstDate.Value < endDate
vous pouvez supprimer le.AddTicks(-1)
.Vous pouvez également utiliser cette:
DbFunctions.DiffDays(date1, date2) == 0
vous pouvez utiliser DbFunctions.TruncateTime() méthode pour cela.
Juste de toujours comparer les Date propriété de DateTime, au lieu de la date de temps.
Lorsque vous effectuez votre requête LINQ, l'utilisation de la date.Date de la requête, c'est à dire:
candidate.Date >= base.Date
. En principe, lecandidate.Date
temps doit être >= 12:00:00, donc, en utilisant la propriété de Date est redondant, mais je vais rester avec Reed conseils.C'est la façon dont je le fais.
Juste si quelqu'un arrive ici googler ou binging... compilé des solutions de contournement:
http://blog.integratedsolution.eu/post/2011/02/06/The-specified-type-member-Date-is-not-supported-in-LINQ-to-Entities.aspx
//Note de Linq Utilisateurs/Programmeurs
Cela devrait vous donner la comparaison exacte pour vérifier si une date se situe dans la plage lorsque l'on travaille avec la participation de l'utilisateur sélecteur de date par exemple:
startdate et enddate sont des valeurs à partir d'un sélecteur de date.
Sans de temps que d'essayer comme ceci:
Vous pouvez l'utilisateur ci-dessous le lien pour comparer 2 dates, sans temps :
de la fonction de comparaison de retour de 3 valeurs différentes: -1 0 1, ce qui signifie dt1>dt2, dt1=dt2, dt1
Essayez ceci... Il fonctionne très bien pour comparer les propriétés de Date entre les deux DateTimes type:
PS. C'est une solution de pis-aller et une très mauvaise pratique, ne doit jamais être utilisé lorsque vous savez que la base de données peut amener des milliers de dossiers...