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


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

вот мой где часть запроса LINQ.

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

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

{"LINQ to Entities не распознает систему метода.Промежуток Времени Вычесть(Системы.DateTime) ' метод, и этот метод не может быть переведен в выражение магазина."}

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

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

6 55

6 ответов:

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

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

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

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

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

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

where (vid.CreatedDate >= oldestDate )

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

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

currentDate = DateTime.Now;

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

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

вы сталкиваетесь с такими isses, потому что предикат должен быть переведен в дерево выражений. И процесс перевода не распознает дату и время.Сейчас.Метод вычитания.

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

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

    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).