LINQ抛出查询嵌套太深的异常

时间:2012-03-23 11:53:06

标签: linq exception nested-queries

我有以下类和对象

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我希望获取ProdIdfilteredProdIds所有记录(假设filteredProdIds已填充Ids):

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

当我启动我的应用程序时,它会引发异常

SQL语句的某些部分嵌套太深。重写查询或将其分解为较小的查询。

我尝试使用 LINQPad 验证查询,将GetAllProducts()方法替换为等效的数据库视图,并且它可以正常工作。

这种例外的原因是什么?

更新

filteredProductIds由此方法填充:

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 个答案:

答案 0 :(得分:1)

filteredProdIds内的项目数量有限制,因为它是一个列表。

要测试,您可以将filteredProdIds设置为:

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

答案 1 :(得分:1)

var filteredProdIds = FilterIds().ToArray();
var products = ProductRepository.GetAllProducts().Where(p => filteredProdIds.Contains(p.ProdId));