为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
阿波罗的战车 2021-11-28 20:10:01
我有以下代码,它停止执行“StackOverFlow 未处理的错误”。var Requests= GetList();// return List of Request objectsIQueryable<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));
查看完整描述

1 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

不知道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

{

  OrderId = x.Order.OrderId,

  RequestId = x.RequestId,

  CustomerName = x.Customer.Name,

  OrderNumber = x.Order.OrderNumber,

  // ...

}).ToList();

如果GetList()可以返回重要的 # 或结果,则使用.Take()and.Skip()而不是.ToList()对结果进行分页。


查看完整回答
反对 回复 2021-11-28
  • 1 回答
  • 0 关注
  • 189 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信