我有以下类和对象
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()
方法替换为等效的数据库视图,并且它可以正常工作。
这种例外的原因是什么?
更新
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();
答案 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));