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 в структуре сущности?
спасибо
Майкл
Ответы
Ответ 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).