2017-02-03 5 views
2

というテーブルにorder_numの値が存在しないShop_Ordersのリストを取得しようとしています。このテーブルには500Kのレコードが含まれており、インデックスはOrderNoです。 List<Shop_Order>には約150個のアイテムがあり、それぞれのアイテムにはorder_numが含まれています。このコードが実行されると、非常に非効率的で遅くなり、メモリ不足の例外が発生します。これを行うより良い方法はありますか?存在を使用しているEFクエリは、例外メモリ例外をスローします。

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() 'を呼び出すのは良いとは思いません。あなたは2つのテーブルに参加しようとしていますか? – Equalsk

+0

前のコメントに加えて、データの量を減らすために 'Take()'メソッドを使用しようとするかもしれません。 – Vladimir

答えて

3

WarehouseOrders.ToList()すべての倉庫の注文をメモリにダウンロードします。

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

しかし、それは、各ショップの注文のデータベースのクエリを実行します:あなたは、少なくともあなたは、データベース側の状態を確認するためにQueryable.Anyを使用しますならばということを避けることができます。私はあなたが1つのデータベースクエリで必要な注文を得ることができると仮定します。例えば。倉庫発注でグループ参加店舗注文を行い、一致のない注文のみを選択することができます。何かが好きです:

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

はい、ありがとうございます!それは現在存在しているものと意味があります。 – bitshift

関連する問題