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 ответов:
принятый ответ лучше в этом случае, но для справки вы можете использовать
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).