Linq to EntityFramework DateTime
В моем приложении я использую Entity Framework.
Моя таблица
-Article
-period
-startDate
Мне нужны записи, которые соответствуют = > DateTime.Now > startDate and (startDate + period) > DateTime.Now
Я пробовал этот код, но теперь он работает
Context.Article
.Where(p => p.StartDate < DateTime.Now)
.Where(p => p.StartDate.AddDays(p.Period) > DateTime.Now)
Когда я запускаю свой код, возникает следующее исключение
LINQ to Entities не распознает метод 'System.DateTime AddDays (Double)', и этот метод не может быть переведен в выражение хранилища.
Ответы
Ответ 1
При использовании LINQ to Entity Framework ваши предикаты внутри предложения Where преобразуются в SQL. Вы получаете эту ошибку, потому что нет перевода в SQL для DateTime.Add()
, что имеет смысл.
Быстрая работа - это прочитать результаты первого предложения Where в памяти, а затем использовать LINQ to Objects для завершения фильтрации:
Context.Article.Where(p => p.StartDate < DateTime.Now)
.ToList()
.Where(p => p.StartDate.AddDays(p.Period) > DateTime.Now);
Вы также можете попробовать EntityFunctions.AddDays, если используете .NET 4.0:
Context.Article.Where(p => p.StartDate < DateTime.Now)
.Where(p => EntityFunctions.AddDays(p.StartDate, p.Period)
> DateTime.Now);
Примечание: В EF 6
теперь System.Data.Entity.DbFunctions.AddDays
.
Ответ 2
Я думаю, что это то, что пытался ответить последний ответ, но вместо того, чтобы пытаться добавить дни к p.startdat(то, что не может быть преобразовано в SQL-запрос), почему бы не сделать что-то, что можно приравнять к sql:
var baselineDate = DateTime.Now.AddHours(-24);
something.Where(p => p.startdate >= baselineDate)
Ответ 3
Как насчет вычитания 2 дней из DateTime.Now:
Context.Article
.Where(p => p.StartDate < DateTime.Now)
.Where(p => p.StartDate > DateTime.Now.Subtract(new TimeSpan(2, 0, 0, 0)))
Честно говоря, я не уверен, чего вы пытаетесь достичь, но это может работать
Ответ 4
Если вам нужно, чтобы ваше выражение переводилось на SQL, вы можете попробовать использовать
System.Data.Entity.Core.Objects.AddDays
Метод.
Фактически отмечается устаревший, но он работает.
Он должен быть заменен на System.Data.Entity.DbFunctions.AddDays, но я не могу его найти...