Подтвердить что ты не робот

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

Я не знаю. Пожалуйста, помогите.

4b9b3361

Ответ 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;