Я читал несколько сообщений, но не нашел решения проблемы, с которой у меня есть 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.
Вы можете вернуть необходимую информацию без фильтрации по дате, а затем отфильтровать дату позже. (Конечно, я не уверен, в каком размере будут ваши данные, поэтому это может быть неэффективным. Если это так, вам понадобится какое-то 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.
попробуйте это,
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();
LINQ to Entities преобразует ваше выражение linq в код SQL, иногда это преобразование является бесшовным, например, добавление целого числа, выбирает, группы и т.д., но иногда абстрагирует утечку, как в операциях даты.