2010-07-12 21 views

Antwort

7

Lazy laden und Deferred sind auch schön (AFAIK, bitte korrigieren Sie mich, wenn ich falsch liege). Der große Unterschied ist zwischen Eager und Faul. Eifrig wird vorne, Faul geschieht nur „nach Bedarf“ und die Ausführung wird geschehen, an der DB Ebene- lassen Sie sich eine einfache JOIN-Anweisung als Beispiel

var people = (from p in people SELECT p).ToList(); 
var jobs = (from j in jobs SELECT j).ToList(); 

var peopleAndJobs = (from p in people JOIN j on j.personId equals p.personId SELECT p).ToList() 

Dies ist ein Beispiel von eifrigem Laden passieren. Wir bekommen ALLE Leute, ALLE Jobs, und wir machen das Mitmachen. Nicht sehr schlau (normalerweise). Hier sieht es wie Lazy-Style aus.

var people = (from p in people SELECT p); 
var jobs = (from j in jobs SELECT j); 

var peopleAndJobs = (from p in people JOIN j on j.personId equals p.personId SELECT p).ToList() 

Was tut ein IQueryable sowohl für Menschen schafft und Job (IQueryable faul ist), und die Verbindung ist in der DB geschieht. Dies spart Netzwerkaktivität und ist in der Regel tatsächlich schneller, da die DB für Joins und ähnliches optimiert ist.

Sofern wir nicht ausdrücklich sagen: "Ich brauche diese Daten!" (indem man es auflistet, es durchläuft usw.), es ist faul. Es gibt einige Macken, aber das sollte ein guter Grund sein.

+0

HINWEIS - die Syntax ist möglicherweise nicht 100%, nur aus dem Stegreif. –

+0

Für Ihr Beispiel, einmal eine ToList tun, ist es eifrig laden, da es einen DB-Hit, um die Daten zu bekommen. Es scheint also eher ein Programmierstil zu sein. Mit EF gibt es jedoch eine Möglichkeit, LazyLoading in den Kontextoptionen als wahr oder falsch festzulegen. Wie passt das zusammen? – DotnetDude

+0

EF4 mit LazyLoading aus müssen Sie People.Include ("Jobs") sagen, um die Jobs-Datensätze zurück zu holen (vorausgesetzt, dass Jobs zu People FK). Wenn LazyLoading aktiviert ist, werden diese Daten bei Bedarf zurückgegeben. I.E. wenn Sie People.Jobs.ToList() sagen; –

3

Lazy/Deferred Laden: Lazy Loading und Deferred Loading sind die gleiche Sache. Die Beziehung wird geladen, wenn auf sie zum ersten Mal zugegriffen wird. Die Idee ist, dass die Daten nicht geladen werden sollten, wenn sie nicht benötigt werden.

Eager Loading: Die Beziehung wird zusammen mit dem Parent-Objekt abgerufen. Dies kann beim Laden von Daten effizienter sein, lädt jedoch Daten unabhängig von den verwendeten/nicht verwendeten Daten.

0

Wenn Objekte von einer Abfrage zurückgegeben werden, werden zugehörige Objekte nicht gleichzeitig geladen.

Stattdessen werden sie automatisch geladen, wenn auf die Navigationseigenschaft zugegriffen wird. Auch bekannt als "Lazy Loading",