LINQ to Entities не распознает метод "Метод System.TimeSpan Subtract (System.DateTime)"
Я пытаюсь выбрать записи в базе данных за 60 дней 30 дней 20 дней в текущей дате.
См. этот запрос ниже.
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();
Но возникла ошибка в этом запросе.
![enter image description here]()
Я не знаю. Пожалуйста, помогите.
Ответы
Ответ 1
Самый простой способ - выработать границы перед выполнением запроса:
// 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
...
Обратите внимание, что ваш текущий запрос даже не имеет смысла, так как каждое предложение "или" 'd указывает, что данное вычисление меньше или равно значению и больше или равно одному и тому же значению. Если вам нужно простое "равное", используйте его. Если нет, то не понятно, что вы пытаетесь сделать.
Если вы пытаетесь записать значения в значения "менее 20", "20-30", "30-60", "более 60", вам нужно будет использовать группировку некоторой формы.
Ответ 2
Вы можете использовать метод EntityFunctions.DiffDays
EntityFunctions.DiffDays(product.EventDate, DateTime.Now) //this will return the difference in days
UPDATE
EntityFunctions теперь устарел, поэтому вместо него следует использовать DBFunctions.
System.Data.Entity.DbFunctions.DiffDays(product.EventDate, DateTime.Now)
Ответ 3
Это должно работать:
using System.Data.Entity.SqlServer;
where (int)SqlFunctions.DateDiff("day", product.EventDate, DateTime.Now) <= 60
Ответ 4
Чтобы добавить к ответу scartag,
Документация MSDN для DbFunctions.DiffDays прямо не упоминает, будет ли значение, возвращаемое DiffDays(), отрицательным, поэтому я подумал, что я предоставлю эту информацию здесь:
Результат будет отрицательным, если дата аргумента 1 больше (т.е. в будущем относительно) даты аргумента 2.
Например, для таблицы Deliveries
с непустым полем ScheduledDeliveryDate
, которое может иметь значения как в прошлом, так и в будущем относительно текущей даты, этот запрос получит все записи с датой доставки/время в течение 2 дней с текущей даты/времени (как в прошлом, так и в будущем):
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;