LINQ to Entities для вычитания 2 дат - PullRequest
57 голосов
/ 20 февраля 2009

Я пытаюсь определить количество дней между двумя датами, используя 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 в структуре сущностей?

спасибо Michael

Ответы [ 6 ]

95 голосов
/ 12 мая 2011

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

where (vid.CreatedDate >= EntityFunctions.AddDays(DateTime.Now, -maxAgeInDay))
42 голосов
/ 20 февраля 2009

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

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

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

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

where (vid.CreatedDate >= oldestDate )

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

19 голосов
/ 12 мая 2011

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

currentDate = DateTime.Now;

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

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

11 голосов
/ 20 февраля 2009

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

1 голос
/ 04 апреля 2010

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

0 голосов
/ 12 декабря 2016

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

    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 query

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...