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, но я не могу его найти...