使用 LINQ 时出现 StackOverFlow 未处理错误”

我有以下代码,它停止执行“StackOverFlow 未处理的错误”。


var Requests= GetList();// return List of Request objects


IQueryable<Order> pos= Enumerable.Empty<Order>().AsQueryable();

if (Requests != null)

 {

   if (Requests.Count > 0)

      {

       var GeneralReq = Requests.Select(loc => loc.Id).ToList();



pos = db.Order.Where(loc => loc.Deleted == false && GeneralReq.Any(a => a == loc.Id));

//HERE, stop executing with StackOverFlow Error.


      }

 }

问题就在这里:


pos = db.Order.Where(loc => loc.Deleted == false && GeneralReq.Any(a => a == loc.Id));


阿波罗的战车
浏览 190回答 1
1回答

一只名叫tom的猫

不知道GetList()可能的问题是什么,它返回了太多的记录,无法安全地将 ID 注入您的.Any()表达式。EF 将希望将其.Any()转换为如下查询:WHERE orders.OrderId IN (22, 25, 45, 46, 52, 66, ...)这通常效率不高,并且您可以传入的 ID 数量有限制。最好将这些条件解析为连接。我不确定这是否会导致堆栈溢出,所以我不相信您拥有的代码示例是完整的,因为如果没有 .ToList() 或类似的表达式,该IQueryable<Order> pos表达式还不会具体化。我会看看您可以解决请求和订单之间的关系。如果 Request 实体作为对 Order 的引用,那么您可以更改GetList()为返回IQueryable<Request>then 以获取订单:IQueryable<Request> requests = GetList();IQueryable<Order> orders = requests.Select(x => x.Order);从那里您可以 .Select() 您想要的订单的详细信息,并具体化结果数据。IQueryable<Request> requests = GetList();List<OrderViewModel> orderVMs = requests.Select(x => new OrderViewModel{&nbsp; OrderId = x.Order.OrderId,&nbsp; RequestId = x.RequestId,&nbsp; CustomerName = x.Customer.Name,&nbsp; OrderNumber = x.Order.OrderNumber,&nbsp; // ...}).ToList();如果GetList()可以返回重要的 # 或结果,则使用.Take()and.Skip()而不是.ToList()对结果进行分页。
打开App,查看更多内容
随时随地看视频慕课网APP