2010-07-06 14 views
8

Tengo esta estructura de la tabla de verdad básica:LINQ a Entidades - carga ansiosos usando include()

dbo.tblCategory
dbo.tblQuestion (muchos a una relación a tblCategory)
dbo.tblAnswer (relación de muchos a uno con tblQuestion)

Básicamente, lo que intento hacer es cargar una categoría, también quiero cargar todas las preguntas y todas las respuestas.

Ahora, he sido capaz de hacer esto utilizando el siguiente código:

public tblCategory Retrieve(int id) 
{ 
    using (var entities = Context) 
    { 
     var dto = 
      (from t in entities.tblCategory.Include("tblQuestion") 
              .Include("tblQuestion.tblAnswers")  
       where t.Id == id 
       select t).FirstOrDefault(); 

      return entities.DetachObjectGraph(dto); 
     } 
    } 
} 

Sin embargo, no estoy completamente enamorado de este; si los nombres de la relación cambian en mi modelo; No voy a obtener un error al construir el proyecto. Idealmente, me gustaría usar una expresión lambda; algo como esto:

public tblCategory Retrieve(int id) 
{ 
    using (var entities = Context) 
    { 
     var dto = 
      (from t in entities.tblCategory.Include(t => t.tblQuestion) 
      where t.Id == id 
      select t).FirstOrDefault(); 

     return entities.DetachObjectGraph(dto); 
    } 
} 

Ahora, con el fragmento de arriba; Estoy atascado en cómo profundizar en la tabla de respuestas. ¿Alguna idea sobre qué podría usar para una expresión lambda para esta?

+0

Linq to Entities en .NET 4.0 soporta carga diferida (habilitada por defecto) hasta donde yo sé. No necesitas molestarte sobre esto entonces. =) – Jens

+0

Suponiendo que estamos en 4.0. Todavía estamos usando 3.5 por el momento =) –

+0

posible duplicado de [Entity Framework .Include() con comprobación de tiempo de compilación?] (Http://stackoverflow.com/questions/2921119/entity-framework-include-with- tiempo de compilación) –

Respuesta

7

OK; Pude hacer que esto funcionara, con alguna ayuda de here.

Básicamente, tengo que hacer esto:

public tblCategory Retrieve(int id) 
{ 
    using (var entities = Context) 
    { 
     var dto = 
      (from t in entities.tblCategory.Include(t => t.tblQuestion) 
              .Include(t => t.tblQuestion.First().tblAnswer) 
      where t.Id == id 
      select t).FirstOrDefault(); 

     return entities.DetachObjectGraph(dto); 
    } 
} 

Desde el enlace de arriba, no puedo más que eliminar la referencia tblAnswers en artículos individuales de la colección de preguntas. Aquí elegí desreferenciar tblAnswers en el primer elemento de la colección. En realidad, esta expresión lambda se usa meramente para generar la ruta de propiedad "tblQuestion.tblAnswers", que cargará las respuestas de todas las preguntas.

Así que, aunque parece que solo estoy sacando las respuestas para la primera pregunta, en realidad estoy sacando todas las respuestas para todas las preguntas.

+6

Si no puede usar 'Include()' con expresiones lambda, agregue 'using System.Data.Entity;'. ([src] (http://stackoverflow.com/a/21005478/1937994)) – gronostaj

+0

O: 'using Microsoft.Data.Entity;' –

Cuestiones relacionadas