2017-02-03 52 views
2

我試圖得到一個Shop_Orders列表,其order_num值不存在於一個名爲WarhouseOrder的表中。該表包含500K條記錄,OrderNo上有索引。 List<Shop_Order>包含約150項,其中每個項目有order_num。當執行這段代碼時,它看起來效率很低,速度很慢,並導致異常的異常。有一個更好的方法嗎?EF查詢使用存在拋出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

我想'''WarehouseOrders'上調用'ToList()'是不好的。你想加入兩張桌子嗎? – Equalsk

+0

除了以前的評論 – Vladimir

回答

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 
+0

以外,您可能會嘗試使用'Take()'方法來減少數據量。是的,謝謝!這對於任何存在都是有意義的 – bitshift