Trato de seleccionar registros en la base de datos en 60 días 30 días 20 días diferentes en la fecha actual.

Por favor, consulte esta consulta en la de abajo.

 var uploads = (
                from files in _fileuploadRepository.Table
                join product in _productRepository.Table on files.Event equals product.Id
                where
                    (
                product.EventDate != null &&
                    (product.EventDate.Subtract(DateTime.Now).Days <= 60 && product.EventDate.Subtract(DateTime.Now).Days >= 60) ||
                    (product.EventDate.Subtract(DateTime.Now).Days <= 30 && product.EventDate.Subtract(DateTime.Now).Days >= 30) ||
                    (product.EventDate.Subtract(DateTime.Now).Days <= 20 && product.EventDate.Subtract(DateTime.Now).Days >= 20))
                    &&
                files.IsSkiped == false
                select files;
            ).ToList();

Pero un error de esta consulta.

LINQ to entities no reconoce el método

Estoy despistado. Por Favor, Ayudar.

  • ¿Los cálculos fuera de la lambda de la declaración. Cuando en el interior de la lambda como usted lo está utilizando, usted está tratando de tener EntityFramework hacer el cálculo cuando no se pretende hacerlo.
  • Así que LINQ to SQL no «traducir» una expresión como product.EventDate.Subtract(DateTime.Now). En C# una alternativa notación es product.EventDate - DateTime.Now donde uno usa una sobrecarga del signo menos (-) operador. ¿Alguien sabe si va a trabajar con LINQ to SQL? Después de todo, la resta de fechas, también es posible en dialectos SQL.
  • Para la EF puede utilizar EntityFunctions.DiffDays
InformationsquelleAutor Ragesh S | 2013-03-07

4 Comentarios

  1. 36

    El enfoque más sencillo es trabajar fuera de los límites antes de de realizar la consulta:

    //Only evaluate DateTime.Now once for consistency. You might want DateTime.Today instead.
    DateTime now = DateTime.Now;
    DateTime nowPlus60Days = now.AddDays(60);
    DateTime nowPlus30Days = now.AddDays(30);
    DateTime nowPlus20Days = now.AddDays(20);
    
    var query = ...
                where product.EventDate <= nowPlus60Days
                ...

    Nota que su consulta actual ni siquiera realmente tiene sentido, ya que cada «o»‘d de la cláusula que indique que el cálculo es menos que o igual a un valor y mayor o igual a el mismo valor. Si desea simple «igual a», a continuación, utilizar ese. Si no, no queda claro de lo que son tratando de hacer.

    Si usted está tratando de balde los valores en «menos de 20», «20-30», «30-60», «más de 60» deberás utilizar la agrupación de alguna forma.

  2. 54

    Podría utilizar el EntityFunctions.DiffDays método

    EntityFunctions.DiffDays(product.EventDate, DateTime.Now) //this will return the difference in days

    ACTUALIZACIÓN

    EntityFunctions es ahora obsoleto por lo que debe utilizar DBFunctions lugar.

    System.Data.Entity.DbFunctions.DiffDays(product.EventDate, DateTime.Now)
    • EntityFunctions es ahora Obsoleto: el uso del Sistema.De datos.Entidad.DbFunctions lugar.
  3. 4

    Esto debería funcionar:

    using System.Data.Entity.SqlServer;
    
    where (int)SqlFunctions.DateDiff("day", product.EventDate, DateTime.Now) <= 60
  4. 3

    Para añadir en scartag la respuesta,

    La Documentación de MSDN para DbFunctions.DiffDays directamente no se menciona si y cuando el valor devuelto por DiffDays() será negativo, así que pensé en proporcionar la información aquí:

    El resultado será negativo cuando el argumento 1 fecha es mayor que (es decir, en el futuro, en relación a) el argumento de 2 fecha.

    Por ejemplo, dada una tabla de Deliveries con un campo distinto de null ScheduledDeliveryDate que pueden tener valores tanto en el pasado y en el futuro en relación a la fecha actual, esta consulta se obtendrá todos los registros con fecha y hora de entrega dentro de 2 días de la fecha/hora actual (pasado y futuro):

    DateTime now = DateTime.Now;
    var results = from d in Deliveries
        where (DbFunctions.DiffDays(d.ScheduledDeliveryDate, now) < 2
            && DbFunctions.DiffDays(d.ScheduledDeliveryDate, now) > -2)
        select d;

Dejar respuesta

Please enter your comment!
Please enter your name here