Linq to EntityFramework DateTime - PullRequest
       10

Linq to EntityFramework DateTime

97 голосов
/ 10 ноября 2010

В моем приложении я использую 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), и этот метод невозможно преобразовать в выражение хранилища.

Ответы [ 4 ]

183 голосов
/ 10 ноября 2010

При использовании LINQ to Entity Framework ваши предикаты в предложении Where переводятся в SQL.Вы получаете эту ошибку, потому что нет перевода на SQL для DateTime.Add(), что имеет смысл.

Быстрый обходной путь - прочитать результаты первого оператора Where в память, а затем использовать LINQ дляОбъекты для завершения фильтрации:

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.

85 голосов
/ 19 октября 2011

Я думаю, что именно этот последний ответ и пытался предложить, но вместо того, чтобы пытаться добавить дни в p.startdat (что не может быть преобразовано в оператор SQL), почему бы не сделать что-то, что можно приравнять к SQL:

var baselineDate = DateTime.Now.AddHours(-24);

something.Where(p => p.startdate >= baselineDate)
3 голосов
/ 10 ноября 2010

Как насчет вычитания 2 дней из DateTime.Now:

Context.Article
.Where(p => p.StartDate < DateTime.Now)
.Where(p => p.StartDate > DateTime.Now.Subtract(new TimeSpan(2, 0, 0, 0)))

Если честно, я не уверен, чего вы пытаетесь достичь, но это может сработать

2 голосов
/ 18 ноября 2014

Если вам нужно, чтобы ваше выражение было переведено в SQL, вы можете попробовать использовать

System.Data.Entity.Core.Objects.AddDays способ.

На самом деле помечен как устаревший, но он работает. Его следует заменить на System.Data.Entity.DbFunctions.AddDays, но я не могу его найти ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...