Как я могу использовать функции DateTime.AddXXXX в запросе Linq-to-Entities? - PullRequest
0 голосов
/ 24 октября 2011

Я пытаюсь использовать AddMonths в запросе

List<Entities.Subscriber> items = (from s in context.Subscribers
                 where s.Validated == false && s.ValidationEmailSent == true && s.SubscriptionDateTime < DateTime.Now.AddMonths(-1)
                 select s).ToList();

Но я получаю ошибку:

LINQ to Entities не распознает метод 'System.DateTimeAddMonths (Int32) ', и этот метод нельзя преобразовать в выражение хранилища.

Есть ли способ использовать эту функцию в своем запросе?

Ответы [ 3 ]

6 голосов
/ 24 октября 2011

Самое простое решение этой проблемы - установить ограничение по времени один раз за до , используя LINQ:

DateTime limit = DateTime.Now.AddMonths(-1);

List<Entities.Subscriber> items = (from s in context.Subscribers
             where s.Validated == false && s.ValidationEmailSent == true && 
                                           s.SubscriptionDateTime < limit)
             select s).ToList();

Или более наглядно ИМО:

var items = context.Subscribers
                   .Where(s => !s.Validated &&
                               s.ValidationEmailSent &&
                               s.SubscriptionDateTime < limit)
                   .ToList();

Здесь нет никакого смысла в использовании выражения запроса, и явные сравнения с true и false являются отвратительным ИМО (если, конечно, ваши свойства не имеют тип Nullable<bool>, конечно).

5 голосов
/ 24 октября 2011

Джон Скит уже предоставил простое исправление, но если вы хотите, чтобы в базе данных запускался бит DateTime.Now.AddMonths, попробуйте метод EntityFunctions.AddMonths.

Это болееОбщий подход, который особенно полезен, когда вы не можете дешево или правильно воспроизвести выражение на клиенте.

0 голосов
/ 24 октября 2011

Вы можете изменить свой код на:

 DateTime oneMonth = DateTime.Now.AddMonths(-1)
    List<Entities.Subscriber> items = (from s in context.Subscribers
                     where s.Validated == false && s.ValidationEmailSent == true && s.SubscriptionDateTime < oneMonth
                     select s).ToList();

Вы должны сделать это, потому что AddMonth - это функция .NET, которая не может быть преобразована в SQL с помощью Linq to Entities.Выполните вычисления в своем коде, а затем используйте полученную дату и время.

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