2010-07-12 23 views

Respuesta

7

La carga diferida y diferida son bastante (AFAIK, corrígeme si me equivoco). La gran diferencia es entre Eager y Lazy. Ansiosos que va a pasar en la delantera, Lazy ocurre sólo "cuando sea necesario" y la ejecución va a pasar en el DB nivel- vamos a echar un simple instrucción de combinación como un ejemplo

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() 

Este es un ejemplo de carga ansiosa. Estamos recibiendo TODAS las personas, TODOS los trabajos, y estamos haciendo la unión en la memoria. No muy inteligente (por lo general). Esto es lo que parece un estilo perezoso.

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() 

Lo que esto hace es crear un IQueryable para las personas y el trabajo (IQueryable es perezoso), y la unión está sucediendo en el PP. Esto ahorra actividad en la red, y generalmente es más rápido, ya que la base de datos está optimizada para hacer combinaciones y cosas así.

A menos que explícitamente digamos "¡Necesito esa información!" (Al listarlo, iterar a través de él, etc.) es flojo. Hay algunas peculiaridades más, pero esto debería ser una cartilla decente.

+0

NOTA: la sintaxis puede no ser del 100%, simplemente salirse del manguito. –

+0

Según su ejemplo, una vez que haga una ToList, es una carga ansiosa ya que hace un DB hit para obtener los datos. Entonces, parece ser más un estilo de programación. Sin embargo, con EF, hay una manera de establecer LazyLoading como verdadero o falso en las Opciones de contexto. ¿Cómo encaja eso? – DotnetDude

+0

EF4 con LazyLoading off requerirá que diga People.Include ("Trabajos") para volver a traer los registros de trabajos (asumiendo que los trabajos están FK'D a Personas). Con LazyLoading activado, esos datos se devolverán cuando sea necesario. ES DECIR. cuando dices People.Jobs.ToList(); –

3

Lazy/Deferred Loading: Lazy loading y la carga diferida son lo mismo. La relación se carga cuando se accede por primera vez. La idea es que si los datos no son necesarios, no deberían cargarse.

Eager Loading: La relación se busca junto con el objeto Parent. Esto puede ser más eficiente al cargar datos, pero cargará datos independientemente de los datos que se usen/no usen.

0

Cuando una consulta devuelve los objetos, los objetos relacionados no se cargan al mismo tiempo.

En su lugar, se cargan automáticamente cuando se accede a la propiedad de navegación. También conocido como "carga diferida",

Cuestiones relacionadas