121 votes

Comment comparer uniquement les composants de date de DateTime dans EF ?

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 la recherche d'une date particulière dans la base de données.

La valeur précédemment saisie dans la base de données a toujours la composante temps de 12:00:00, alors que la date saisie à partir du sélecteur a une composante temps différente.

Je ne m'intéresse qu'aux composantes de la date et j'aimerais ignorer la composante temps.

Quelles sont les façons d'effectuer cette comparaison en C# ?

Aussi, comment faire cela en LINQ ?

UPDATE : Sur LINQ to Entities, ce qui suit fonctionne bien.

e => DateTime.Compare(e.FirstDate.Value, SecondDate) >= 0

140voto

Mandeep Janjua Points 896

Utilisez la classe EntityFunctions pour rogner la partie temps.

using System.Data.Objects;    

var bla = (from log in context.Contacts
           where EntityFunctions.TruncateTime(log.ModifiedDate) ==  EntityFunctions.TruncateTime(today.Date)
           select log).FirstOrDefault();

Source : http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/84d4e18b-7545-419b-9826-53ff1a0e2a62/

UPDATE

À partir de EF 6.0 et plus, EntityFunctions est remplacé par DbFunctions .

127voto

Fredrik Mörk Points 85694

NOTE : au moment de la rédaction de cette réponse, la relation EF n'était pas claire (cela a été modifié dans la question après la rédaction de cette réponse). Pour une approche correcte avec EF, vérifiez Réponse de Mandeeps .


Vous pouvez utiliser le DateTime.Date pour effectuer une comparaison de date seulement.

DateTime a = GetFirstDate();
DateTime b = GetSecondDate();

if (a.Date.Equals(b.Date))
{
    // the dates are equal
}

25voto

jrojo Points 244

Je pense que cela pourrait vous aider.

J'ai créé une extension car je dois comparer des dates dans des référentiels remplis de données EF et donc .Date n'était pas une option puisqu'elle n'est pas implémentée dans la traduction LinqToEntities.

Voici le code :

        /// <summary>
    /// Check if two dates are same
    /// </summary>
    /// <typeparam name="TElement">Type</typeparam>
    /// <param name="valueSelector">date field</param>
    /// <param name="value">date compared</param>
    /// <returns>bool</returns>
    public Expression<Func<TElement, bool>> IsSameDate<TElement>(Expression<Func<TElement, DateTime>> valueSelector, DateTime value)
    {
        ParameterExpression p = valueSelector.Parameters.Single();

        var antes = Expression.GreaterThanOrEqual(valueSelector.Body, Expression.Constant(value.Date, typeof(DateTime)));

        var despues = Expression.LessThan(valueSelector.Body, Expression.Constant(value.AddDays(1).Date, typeof(DateTime)));

        Expression body = Expression.And(antes, despues);

        return Expression.Lambda<Func<TElement, bool>>(body, p);
    }

alors vous pouvez l'utiliser de cette manière.

 var today = DateTime.Now;
 var todayPosts = from t in turnos.Where(IsSameDate<Turno>(t => t.MyDate, today))
                                      select t);

11voto

algreat Points 2494

Si vous utilisez le Date pour les entités de la DB, vous obtiendrez une exception :

"The specified type member 'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported."

Vous pouvez utiliser quelque chose comme ça :

  DateTime date = DateTime.Now.Date;

  var result = from client in context.clients
               where client.BirthDate >= date
                     && client.BirthDate < date.AddDays(1)
               select client;

9voto

Craig Stuntz Points 95965

Pour le faire dans LINQ to Entities, vous devez utiliser méthodes utilisées :

var year = someDate.Year;
var month = ...
var q = from r in Context.Records
        where Microsoft.VisualBasic.DateAndTime.Year(r.SomeDate) == year 
              && // month and day

C'est laid, mais ça marche, et c'est fait sur le serveur de base de données.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X