c# - inner - LINQ to Entities no reconoce el método ''System.TimeSpan Substract(System.DateTime)'' method
select entity framework c# (4)
Intento 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 a continuación.
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 se produjo un error en esta consulta.
No tengo idea. Por favor ayuda.
El enfoque más simple es calcular los límites antes 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
...
Tenga en cuenta que su consulta actual ni siquiera tiene sentido, ya que cada cláusula "o" ''d indica que el cálculo dado es menor o igual que un valor y mayor o igual que el mismo valor. Si quiere un "igual a" simple, entonces use eso. Si no, no está claro lo que estás tratando de hacer.
Si intenta dividir los valores en "menos de 20", "20-30", "30-60", "más de 60", deberá usar el agrupamiento de alguna forma.
Esto debería funcionar:
using System.Data.Entity.SqlServer;
where (int)SqlFunctions.DateDiff("day", product.EventDate, DateTime.Now) <= 60
Para agregar a la respuesta de Scartag,
La documentación de MSDN para DbFunctions.DiffDays no menciona directamente si el valor devuelto por DiffDays () será negativo, y cuándo, y entonces pensé que proporcionaría esa información aquí:
El resultado será negativo cuando la fecha del argumento 1 sea mayor que (es decir, en el futuro en relación con) la fecha del argumento 2.
Por ejemplo, dada una tabla Deliveries
con un campo no nulo ScheduledDeliveryDate
que puede tener valores tanto en el pasado como en el futuro en relación con la fecha actual, esta consulta obtendrá todos los registros con una fecha / hora de entrega dentro de los 2 días de la fecha actual fecha / hora (tanto pasada como futura):
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;
Puede usar el método EntityFunctions.DiffDays
EntityFunctions.DiffDays(product.EventDate, DateTime.Now) //this will return the difference in days
ACTUALIZAR
EntityFunctions ahora está obsoleto, por lo que debe usar DBFunctions en su lugar.
System.Data.Entity.DbFunctions.DiffDays(product.EventDate, DateTime.Now)