2010-04-30 7 views
7

Wenn ich ein Objekt, das faul Last ein Verein mit sehr großen Objekten, ist es eine Möglichkeit, die Verarbeitung die faule Belastung tritt an der Zeit zu tun? Ich dachte, ich könnte AssociateWith oder LoadWith von DataLoadOptions verwenden, aber es gibt sehr, sehr spezifische Einschränkungen, was Sie in denen tun können. Grundsätzlich muss ich benachrichtigt werden, wenn ein EntitySet <> entscheidet, dass es Zeit ist, das zugeordnete Objekt zu laden, so dass ich dieses Ereignis abfangen und eine Bearbeitung für das geladene Objekt vornehmen kann. Ich möchte nicht einfach durch das EntitySet gehen, wenn ich das Eltern-Objekt lade, weil das alle lazy-loaded-Elemente zum Laden zwingt (was den Zweck des Lazy Loading komplett zunichte macht).LINQ to SQL: Auf Last Verarbeitung faul geladenen Verbände

+0

Sie verwenden den Begriff EntitySet <> wobei LINQ to SQL Table <> verwendet. Verwenden Sie stattdessen Entity Framework? Wenn ja, glaube ich, dass ich deine Antwort habe. –

Antwort

2

Abonnieren Sie den Listchanged Ereignis

EntitySet <T> macht ein Event namens Listchanged, die Sie erkennen können, ob ein Element hinzugefügt wird. Werten Sie die ListChangedType-Eigenschaft des ListChangedEventArgs aus. Hier finden Sie eine Verknüpfung zu den in der ListChangedType-Enumeration verfügbaren Werten.

Es besteht keine Gefahr, die Last zu zwingen, so lange auszuführen, wie Sie den Enumerator anfordernden zu vermeiden.

http://msdn.microsoft.com/en-us/library/system.componentmodel.listchangedtype.aspx

+0

Funktioniert nicht, die Load() - Funktion in EntitySet, die die IEnumerable-Quelle (= Lazy) aufzählt, löst keine ListChangedEvents. –

+0

Beim Laden muss eine innere Liste ausgefüllt werden. Ich frage mich, ob die neuesten Rx (reaktive Erweiterungen) helfen könnten, das Laden zu erkennen. Siehe http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx. – randolphcabral

+0

Es füllt tatsächlich eine innere Liste auf, die keine ListChanged-Benachrichtigungen auslöst. –

1

Ich sehe keine Erweiterungspunkte für diese zur Verfügung; die einzige Sache, die ich sehen kann, ist in der FK-Entität gibt es eine Created-Methode für jedes einzelne Objekt, das aus dem Konstruktor ausgelöst wird ...

So der Konstruktor Aufrufe erstellt, und persönlich, ich bin nicht 100% sicher, dass das Unternehmen Set Laden erzeugt jedes einzelne Objekt zu diesem Zeitpunkt, und löst das Ereignis ...

HTH.

+1

Nun, das hat nicht direkt geholfen, aber es hat mich daran erinnert, dass PLINQO eine OnLoaded-Methode hat, die ich verwenden kann. Immer noch nicht perfekt, aber es kann mich an meinem aktuellen Problem vorbeibringen. –

0

Sie sind verpflichtet, auf jeden Fall nicht die Standard-EntitySet<> zu verwenden, sondern stattdessen jede IList <> Sammlung verwenden können. Ich habe eine kleine Reflektion über EntitySet <> gemacht, habe aber keinen Haken in der Load() -Methode gefunden, die das Aufzählen der Lazy-Source des Entity-Sets implementiert (dort wird das EntitySet tatsächlich abgefragt und materialisiert).

LINQ to SQL die Assign() Methode verwenden, um eine IEnumerable Quelle zuweisen (standardmäßig faul ist) zu Ihrer Sammlung. Von dort aus können Sie Ihr eigenes Lazy-Laden von EntitySet mit einem benutzerdefinierten Hook an dem Punkt implementieren, an dem Sie zuerst die Quellensammlung aufzählen (führen Sie die Abfrage aus).