2017-02-03 4 views
2

Ich versuche, eine Liste von Shop_Orders wo ihre order_num Wert nicht in einer Tabelle namens WarhouseOrder. Diese Tabelle enthält 500K-Datensätze, und es gibt einen Index für OrderNo. List<Shop_Order> enthält ca. 150 Artikel, von denen jeder eine order_num hat. Wenn dieser Code ausgeführt wird, scheint er sehr ineffizient und langsam zu sein und führt zu einer Outofmemory-Ausnahme. Gibt es einen besseren Weg, dies zu tun?EF-Abfrage mit exists throws outoutmemory Ausnahme

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

Ich stelle mir vor, 'ToList()' auf 'WarehouseOrders' ist nicht gut. Versuchen Sie, zwei Tabellen zu verbinden? – Equalsk

+0

Sie könnten versuchen, 'Take()' Methode verwenden, um die Menge der Daten, zusätzlich zu dem vorherigen Kommentar zu reduzieren – Vladimir

Antwort

3

WarehouseOrders.ToList() lädt alle Lagerbestellungen in den Speicher. Sie können zumindest vermeiden, dass, wenn Sie Queryable.Any überprüfen Zustand auf Seite Datenbank verwenden werden:

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

Aber das wird für jedes Geschäft, um Datenbankabfrage tun. Ich gehe davon aus, dass Sie mit einer einzigen Datenbankabfrage die benötigten Shop-Bestellungen erhalten können. Z.B. Sie können Gruppen-Shop-Bestellungen mit Lagerbestellungen ausführen und nur diejenigen auswählen, die keine Übereinstimmungen haben. Etwas wie:

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

Ja, danke! Das macht jetzt Sinn mit existierenden gegen alle – bitshift