Comment comparer DateTime sans temps via LINQ?
J'ai
var q = db.Games.Where(t => t.StartDate >= DateTime.Now).OrderBy(d => d.StartDate);
Mais il compare notamment le temps une partie de DateTime
. Je n'ai vraiment pas besoin.
Comment le faire sans le temps?
Merci!
Vous devez vous connecter pour publier un commentaire.
Suffit d'utiliser la
Date
propriété:Notez que j'ai évalué de manière explicite
DateTime.Today
une fois de sorte que la requête est conforme - sinon, chaque fois que la requête est exécutée, et même dans l'exécution,Today
pourrait changer, donc, si vous voulez obtenir des résultats incohérents. Par exemple, supposons que vous avez eu des données de:Sûrement soit les deux entrées 1 et 3 devraient être dans les résultats, ou ni d'eux doit... mais si vous évaluez
DateTime.Today
et il changements pour le 9 Mars, après avoir effectué les deux premières vérifications, vous pourriez vous retrouver avec des entrées 1, 2, 4.Bien sûr, à l'aide de
DateTime.Today
suppose que vous êtes intéressé à la date de la local fuseau horaire. Qui peut ne pas être approprié, et vous devriez le faire absolument assurer que vous savez ce que vous voulez dire. Vous peut souhaitez utiliserDateTime.UtcNow.Date
au lieu de cela, par exemple. Malheureusement,DateTime
est une mauvaise bête...EDIT: vous pouvez aussi Vous voulez vous débarrasser des appels à
DateTime
propriétés statiques au total - ils rendre le code difficile de test de l'unité. Dans Noda Temps nous avons une interface spécifiquement pour cet usage (IClock
), qui nous nous attendons à être injecté de façon appropriée. Il y a un "système" temps de mise en œuvre pour la production et un "stub" mise en œuvre pour les essais, ou vous pouvez la mettre en œuvre vous-même.Vous pouvez utiliser la même idée sans l'aide de Noda Temps, bien sûr. De test de l'unité de ce morceau de code que vous pouvez vous passer de la date, mais vous serez l'obtention par les quelque part - et l'injection d'une horloge signifie que vous pouvez tester tous le code.
SqlFunctions
pour cela, mais je ne peux pas la voir...EntityFunctions.TruncateTime
.La Date de la propriété n'est pas pris en charge par LINQ to Entities -- vous recevrez un message d'erreur si vous essayez de l'utiliser sur un champ DateTime dans une requête LINQ to entities. Vous pouvez, cependant, garniture de dates à l'aide de la DbFunctions.TruncateTime méthode.
EntityFunctions
a maintenant été remplacé parDbFunctions
dans les versions ultérieures de l'Entity FrameworkEssayer ce code
J'ai trouvé que dans mon cas c'est le seul moyen de travail: (dans mon application, je veux supprimer les anciennes entrées de journal)
Je ne comprends pas pourquoi le Jon solution n'est pas de travail ....
Month
propriété d'unDateTime
à laYear
propriété de l'autre?Il arrive que LINQ n'aime pas les propriétés telles que
DateTime.Date
. Il ne peut tout simplement pas se convertir à des requêtes SQL. J'ai donc trouvé un moyen de comparer les dates à l'aide de Jon réponse, mais sans que coquineDateTime.Date
. Quelque chose comme ceci:var q = db.Games.Where(t => t.StartDate.CompareTo(DateTime.Today) >= 0).OrderBy(d => d.StartDate);
De cette façon, nous sommes en comparant à une base de données complète de type DateTime, avec tout ce que la date et l'heure de trucs, comme 2015-03-04 11:49:45.000 ou quelque chose comme ça, avec un DateTime qui représente le premier ordre de la milliseconde de la journée, comme 2015-03-04 00:00:00.0000.
Tout DateTime nous comparer à celle
DateTime.Today
sera de retour à nous en toute sécurité si cette date est postérieure ou la même. À moins que vous souhaitez comparer littéralement le même jour, dans ce cas, je pense que vous devriez aller pour le César de la réponse.La méthode
DateTime.CompareTo()
est simplement envie d'Orienté Objet trucs. Elle renvoie -1 si le paramètre est antérieure à la date que vous l'avez mentionné, 0 si c'est LITTÉRALEMENT l'ÉGALITÉ (avec tout ce que timey choses) et 1 si elle est postérieure.La
.Date
réponse est trompeuse, car vous obtenez le message d'erreur mentionné avant. Une autre façon de comparer, autres que ceux mentionnésDbFunctions.TruncateTime
, peut-être aussi:C'est mieux(plus lisible) dans le SQL généré requête. Mais je dois avouer qu'il semble pire dans le code C# XD. J'ai été le tester quelque chose et il me semblait
TruncateTime
ne fonctionnait pas pour moi malheureusement, la faute est entre le clavier et la chaise, mais en attendant, j'ai trouvé cette alternative.Essayer
J'ai trouvé cette question alors que j'étais coincé avec la même requête. J'ai enfin trouvé sans l'aide de DbFunctions.
Essayez ceci:
De cette façon, par la bifurcation de la date de pièces que nous comparer efficacement que les dates, laissant ainsi le temps.
Espère que ça aide. Excusez-moi pour la mise en forme de la réponse, c'est ma première réponse.