我正在尝试获取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();
答案 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