84 votos

Cómo comparar sólo a los componentes de una fecha del DateTime en EF?

Estoy teniendo dos valores de fecha, uno que ya está almacenada en la base de datos y el otro elegido por el usuario usando DatePicker. El caso de uso es la búsqueda de una fecha determinada a partir de la base de datos.

El valor introducido previamente en la base de datos siempre tiene componente de tiempo de 12:00:00, mientras que la fecha en la que ingresó desde el selector de tiempo diferentes componentes.

Estoy interesado sólo en la fecha de componentes y quisiera ignorar el componente de tiempo.

¿Cuáles son las maneras de hacer esta comparación en C#?

También, de cómo hacer esto en LINQ?

ACTUALIZACIÓN: En LINQ to entities, las siguientes obras bellas.

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

100voto

Fredrik Mörk Puntos 85694

Usted puede utilizar el DateTime.Date de la propiedad para realizar una fecha única comparación.

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

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

77voto

Mandeep Janjua Puntos 896

Uso de la clase EntityFunctions por el recorte de la porción de tiempo.

using System.Data.Objects;    

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

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

20voto

jrojo Puntos 244

Creo que esto podría ayudarle.

Hice una extensión de la que ya tengo para comparar fechas en los repositorios lleno de EF datos, y así .La fecha no era una opción, ya que no está implementado en LinqToEntities traducción.

Aquí está el código:

        /// <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);
    }

a continuación, se puede utilizar en este modo.

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

7voto

algreat Puntos 2494

Si usted utiliza el Date de la propiedad de DB Entidades obtendrá excepción:

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

Usted puede usar algo como esto:

  DateTime date = DateTime.Now.Date;

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

4voto

Reed Copsey Puntos 315315

Siempre compare la Fecha de propiedad del DateTime, en lugar de la fecha completa de tiempo.

Cuando usted hace su consulta LINQ, la fecha de uso.Fecha de la consulta, es decir:

var results = from c in collection
              where c.Date == myDateTime.Date
              select c;

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X