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

LINQ to Entities для вычитания 2 дат

Я пытаюсь определить количество дней между двумя датами, используя LINQ с Entity Framework. Он говорит мне, что он не распознает Subtract в классе System.TimeSpan

Вот моя часть запроса LINQ.

where ((DateTime.Now.Subtract(vid.CreatedDate).TotalDays < maxAgeInDays))

Вот ошибка, которую я получаю в отладчике VS.NET

{ "LINQ to Entities не распознает метод" System.TimeSpan Subtract (System.DateTime) ", и этот метод не может быть переведен в выражение хранилища." }

Я делаю что-то неправильно или есть лучший способ получить количество дней между 2 DateTimes в структуре сущности?

спасибо Майкл

4b9b3361

Ответ 1

Вот как я получил его на работу

Я определил переменную datetime, которая представляет самую старую дату

DateTime oldestDate = DateTime.Now.Subtract(new TimeSpan(maxAgeInDays, 0, 0, 0, 0));
...

то я изменил, где часть запроса LINQ

where (vid.CreatedDate >= oldestDate )

работал как шарм - спасибо Micah за то, что я подумал о дереве выражений

Ответ 2

Принятый ответ лучше в этом случае, но для справки вы можете использовать класс EntityFunctions для выполнения операций с датами, среди прочих вещи.

where (vid.CreatedDate >= EntityFunctions.AddDays(DateTime.Now, -maxAgeInDay))

Ответ 3

Вы также можете использовать System.Data.Objects.EntityFucntions:

currentDate = DateTime.Now;

...
where  EntityFunctions.DiffDays(currentDate, vid.CreatedDate) < maxAgeIdDays 

Все функции из EntityFunctions предназначены только для Linq-to-entity и отображаются в SQL-функции.

Ответ 4

Вы сталкиваетесь с такими проблемами, потому что предикат должен быть переведен в дерево выражений. И процесс перевода не распознает метод DateTime.Now.Subtract.

Ответ 5

Дело в том, что при разработке LINQ to Entities необходимо перевести весь запрос в SQL-запросы. То, где он не может распознать метод Subtract. Это произойдет, когда вы попытаетесь использовать метод С#/VB внутри запроса. В этих случаях вам нужно выяснить способ извлечения этой части из запроса. Эта статья объясняет немного больше: http://mosesofegypt.net/post/LINQ-to-Entities-what-is-not-supported.aspx

Ответ 6

Вы можете определить новое свойство в своей модели:

    public DateTime StartDate{ get; set; }
    public DateTime EndDate{ get; set; }
    public TimeSpan CalculateTime{
        get
        {
            return EndDate.Subtract(StartDate);
        }
    }

Теперь вы можете использовать что-то вроде этого:

var query = from temp in db.Table
select new MyModel {
    Id = temp.Id,
    Variable1 = temp.Variable1,
    ...
    EndDate = temp.EndDate,
    StartDate = temp.StartDate
}

Когда вы посмотрите результат, вы можете использовать return, например:

return query

Теперь в запросе мы имеем CalculateTime (вычитаем из EndDate и Startdate).