2010-08-02 16 views
14

Tengo un generador de documentos que contiene consultas para aproximadamente 200 artículos en este momento, pero probablemente será de más de 500 cuando se complete. Recientemente me di cuenta de que algunas de las asignaciones denotan carga diferida. Esto presenta un problema para el generador de documentos ya que necesita acceso a todas estas propiedades en función de qué documento se está generando.Desactivar toda la carga diferida o forzar la carga ansiosa para un contexto LINQ

Si bien conozco el DataLoadOptions que se puede especificar en el contexto, esto me obligaría a tener que especificar explícitamente cada columna que podría cargarse. Eso es al norte de 1000 ya que toda la obtención de datos tiene lugar en un contexto.

¿Hay alguna forma de desactivar la carga diferida para un contexto o habilitar explícitamente la carga ansiosa para ignorar la propiedad de carga diferida? ¿Tal vez extender la clase de contexto DB y anular algo?

+0

Solución final: http://gist.github.com/506573 –

Respuesta

6

Usted tendrá que establecer DeferredLoadingEnabled, y luego se incluyen todos los establecimiento a través de una reflexión como:

DataLoadOptions dataLoadOptions = new DataLoadOptions(); 

foreach (PropertyInfo pi in typeof(SomeThingyClass).GetProperties()) 
{ 
    ParameterExpression paramExp = Expression.Parameter(typeof(SomeThingyClass), "s"); 
    Expression expr = Expression.Convert(Expression.Property(paramExp, pi.Name), typeof(object)); 
    LambdaExpression lambda = Expression.Lambda(expr, paramExp); 
    dataLoadOptions.LoadWith((Expression<Func<SomeThingyClass, object>>) lambda); 
} 
+1

Por cierto, ¿qué es DeferredLoadingEnabled en términos de EF? ¿Es lo mismo que context.ContextOptions.LazyLoadingEnabled = true? – Martin

+0

Las propiedades están todas en diferentes tablas también. Si también los repito utilizando el método 'GetProperties()' del contexto, ¿cómo puedo filtrar solo los datos 'System.Data.Linq.Table'? –

+0

Lo más fácil es comprobar si 'pi.PropertyType.Name ==" Table'1 "' –

0

Esto es complicado con LINQ a SQL. La respuesta corta es, depende.

Si sus entidades están dispuestas de tal manera que usted tiene una relación que refleja esto:

Customers -> Orders -> OrderDetails

Y lo que necesita para evaluar las propiedades de los 3 entidades con el fin de tomar una decisión, su La mejor apuesta es ir con la escritura de una unión. El uso de .LoadWith buscará Customers y Orders utilizando una única instrucción, pero luego emitirá una consulta para cada registro OrderDetails.

Por lo tanto, incluso si especificara cada relación hija con LoadWith, no obtendrá una sola consulta emitida para recuperar el resultado.

+0

Todas las propiedades están solo en el objeto que se está seleccionando. No se seguirán relaciones después del hecho. –

Cuestiones relacionadas