LINQ, выбрасывающий запрос, вложил слишком глубоко исключение - PullRequest
3 голосов
/ 23 марта 2012

У меня есть следующий класс и объекты

Product{int ProdId{get; set;}, string ProdDesc{get; set;}}

IQueryable<Product> products = ProductRepository.GetAllProducts();

List<int> filteredProdIds = new List<int>();

Метод GetAllProducts() выполняет пару соединений над некоторыми EF-классами и возвращает объект IQueryable<Product>.Я уже проверил, возвращает ли он ожидаемые значения, и он это делает.

С products Я хочу получить все записи, у которых есть ProdId в filteredProdIds (предположим, что filteredProdIds уже былозаполнено Ids):

products = products.Where(p => filteredProdIds.Any(fp => fp.Equals(p.ProdId)));

Когда я запускаю свое приложение, оно выдает исключение

Некоторая часть вашего оператора SQL вложена слишком глубоко.Перепишите запрос или разбейте его на более мелкие запросы.

Я попытался проверить запрос с помощью LINQPad , заменив метод GetAllProducts() эквивалентным представлением базы данных ., и это работает.

Что может быть причиной этого исключения?

ОБНОВЛЕНИЕ

FilterProductIds заполняется этим методом:

IEnumerable<int> filteredProductIds = products.Select(p => p.partId).Distinct().ToList();

Я нашел способ избежать этого исключения, но должно быть намного более чистое решение:

foreach (var filteredProdId in filteredProdIds)
{
   product.Union(product.Where(p => p.ProdId.Equals(filteredProdId)));
}
product.Distinct();

Ответы [ 2 ]

1 голос
/ 23 марта 2012
var filteredProdIds = FilterIds().ToArray();
var products = ProductRepository.GetAllProducts().Where(p => filteredProdIds.Contains(p.ProdId));
1 голос
/ 23 марта 2012

Существует ограничение на количество элементов в filteredProdIds, поскольку это список.

Для проверки можно установить filteredProdIds в:

filteredProdIds = filteredProdIds.Take(1).ToList();
...