3

我有以下类和对象

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

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

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

该方法对一些EF 类GetAllProducts()执行几个连接并返回一个对象。我已经测试过它是否会返回预期值并且确实如此。IQueryable<Product>

products我想获取所有包含它们的记录ProdIdfilteredProdIds假设filteredProdIds已经被填充Ids):

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

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

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

我尝试使用LINQPadGetAllProducts()验证查询,方法是用等效的数据库视图替换该方法,并且它可以工作。

此异常的原因可能是什么?

更新

filtersProductIds 由这个方法填充:

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();
4

2 回答 2

1

filteredProdIds由于它是一个列表,因此可以在其中包含多少个项目是有限制的。

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

filteredProdIds = filteredProdIds.Take(1).ToList();
于 2012-03-23T12:09:25.750 回答
1
var filteredProdIds = FilterIds().ToArray();
var products = ProductRepository.GetAllProducts().Where(p => filteredProdIds.Contains(p.ProdId));
于 2012-03-23T12:12:28.950 回答