LINQ to Entities: использование DateTime.AddMonth в лямбда-выражении

2

Я читал несколько сообщений, но не нашел решения проблемы, с которой у меня есть LINQ To Entities, Lambda Expressions и DateTime.AddMonth.

Проблема в том, что я пытаюсь использовать DateTime.AddMonth внутри выражения Lambda, и я получаю эту ошибку:

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

когда я выполняю этот фрагмент кода:

List<Orders> orders = context.Orders
                        .Where(o => o.IdOrderStatus == 1)
                        .Where(o => o.PaymentDate.Value.AddMonths(o.Products.ProductCategories.CommissionableMonths) > DateTime.Now)
                        .ToList();

Есть ли способ избежать этого исключения, но поддерживать такое же поведение?

Я не очень много знаю о Linq, Lambdas или Entity Framework.

Спасибо вам заблаговременно!

Gsus.

  • 0
    Является ли o.Products.ProductCategories.Commissionable и Int32 значением количества месяцев, которое вы хотите добавить в PaymentDate?
  • 0
    Вы должны отметить этот вопрос Linq и C #
Показать ещё 1 комментарий
Теги:
linq
lambda

3 ответа

2

Вы можете вернуть необходимую информацию без фильтрации по дате, а затем отфильтровать дату позже. (Конечно, я не уверен, в каком размере будут ваши данные, поэтому это может быть неэффективным. Если это так, вам понадобится какое-то SQL-решение - возможно, хранимая процедура.)

List<Orders> orders = context.Orders
                        .Where(o => o.IdOrderStatus == 1)
                        .ToList();
orders = orders.Where(o.PaymentDate.Value.AddMonths(o.Products.ProductCategories.CommissionableMonths) > DateTime.Now);

Это превращает часть AddMonths запроса в метод Linq-to-Objects вместо вызова Linq-to-Entities.

  • 0
    Спасибо Джон. PaymentDate - один из больших фильтров, которые нам нужны для получения небольшого количества данных, поэтому мы будем использовать хранимую процедуру для решения этой проблемы. С уважением.
1

попробуйте это,

var today =DateTime.Now;
List<Orders> orders = context.Orders
                    .Where(o => o.IdOrderStatus == 1)
                    .Where(o => SqlFunctions.DateAdd("month"   ,o.Products.ProductCategories.CommissionableMonths,o.PaymentDate) > today)
                    .ToList();
0

LINQ to Entities преобразует ваше выражение linq в код SQL, иногда это преобразование является бесшовным, например, добавление целого числа, выбирает, группы и т.д., но иногда абстрагирует утечку, как в операциях даты.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню