Как вставить метод внутри лямбда-метода расширения LINQ - PullRequest
1 голос
/ 20 марта 2012

Я должен поместить метод в лямбду LINQ. У меня есть следующий код:

string productName = "Some product";

searchShoppingCart = shoppingCart.Where(m => productName.Equals(_ProductRepository.GetProductName(m.Id)));

В основном этот код используется для выбора всех shoppingCart экземпляров, которые содержат productName.

Метод string GetProductName(int shoppingCartId) - это метод из _ProductRepository, который возвращает имя одного продукта. Как этот метод реализован и его логика не имеет значения.

Проблема в том, что LINQ выдает исключение . Я знаю причины, по которым выбрасывается это исключение, я просто хотел бы найти обходной путь. Я пытался

var productContained = shoppingCart.Select(sc => new
                    {
                        scId = sc.Id,
                        productName = _ProductRepository.GetProductName(sc.Id)
                    });

searchShoppingCart = shoppingCart.Where(sc => sc.Id.Equals(productContained.Where(pc => pc.productName.Equals(productName))
                                                                           .Select(pc => pc.Id)));

но это дает мне то же исключение. Есть ли другой обходной путь?

UPDATE

Исключение составляет

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

Ответы [ 2 ]

2 голосов
/ 20 марта 2012

Выдает исключение, потому что пытается преобразовать ваш код в SQL (и не может этого сделать).Прочитайте эту статью для некоторых обходных путей: http://thoai -nguyen.blogspot.it / 2011/05 / custom-function-entity-framework.html

0 голосов
/ 20 марта 2012

Если вы работаете IQueryable (что, я полагаю, вы делаете), то вызов пользовательского метода .NET не может быть переведен в запрос - вот причина, по которой вы получаете исключение.

Обходным путем будет выборка всех возможных корзин покупок и применение вашего метода в списке продуктов в памяти - например,

searchShoppingCart = shoppingCart.ToList().Where(m => productName.Equals(_ProductRepository.GetProductName(m.Id)))

Конечно, это отстой, потому что побеждает всю цель!

Лучшим обходным решением было бы выставить свойство продукта, доступное для навигации в объекте корзины покупок, и использовать то же самое - например,

searchShoppingCart = shoppingCart.Where(m => productName.Equals(m.Product.Name))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...