使用存在的EF查询抛出outofmemory异常

时间:2017-02-03 16:19:31

标签: c# entity-framework

我正在尝试获取Shop_Orders的列表,其中order_num值在WarhouseOrder的表中不存在。该表包含500K记录,OrderNo上有索引。 List<Shop_Order>包含大约150个项目,每个项目都有order_num。执行此代码时,它看起来非常低效,速度慢并导致outofmemory异常。有更好的方法吗?

List<Shop_Order> new_orders = (from a in osource.order 
    where !ctx.WarehouseOrders.ToList()
    .Exists(o => o.OrderNo == a.order_num) select a).ToList();

1 个答案:

答案 0 :(得分:3)

WarehouseOrders.ToList()将所有仓库订单下载到内存中。如果您使用Queryable.Any检查数据库端的条件,则至少可以避免这种情况:

!ctx.WarehouseOrders.Any(o => o.OrderNo == a.order_num)

但是,这将为每个车间订单执行数据库查询。我假设您可以通过单个数据库查询获得所需的车间订单。例如。您可以使用仓库订单进行组合加入车间订单,并仅选择那些没有匹配的车间订单。类似的东西:

from so in ctx.ShopOrders
join wo in ctx.WarehouseOrders on so.order_num equals wo.OrderNo into g
where !g.Any()
select so