lunes, 26 de enero de 2009

ADO.NET Entity Framework: ¿Cómo incluir los objetos relacionados?

Una tarea común en el desarrollo con ADO.NET Entity Framework es escribir una consulta que incluya una o más entidades relacionadas. Por ejemplo, quiero obtener todas las fotos de un autor incluyendo los datos del autor:

var photos = from p in db.Photos.Include("Author")
             where (p.AuthorId == authorId)
             select p;

El método Include especifica que se incluya la entidad Author asociada a cada Photo.

Si además del autor, quisiera incluir otra entidad relacionada a la foto como su Categoría, podría agregar otro include:

var photos = from p in db.Photos.Include("Author").Include("Category")
             where (p.AuthorId == authorId)
             select p;

En este caso se incluirá también la categoría asociada a cada Photo.

Otro método que también permite cargar entidades relacionadas es el método Load(). Supongamos que deseo obtener los datos de una foto y sus palabras claves asociadas, podría escribir algo como:

var photo = db.Photos.First(p => p.Id == photoId);
photo.Tags.Load();

En otro escenario, podría interesarme verificar primero, antes de ejecutar el método Load():

var photo = service.GetPhoto(id);
if (!photo.Tags.IsLoaded) photo.Tags.Load();

La propiedad IsLoaded permite comprobar si se han cargado o no los objetos relacionados en la colección de Tags.

Para simplificar este trabajo, he creado un extension method EnsureLoad() que aplica a EntityCollection, así el código anterior se reduce a:

var photo = service.GetPhoto(id);
photo.Tags.EnsureLoad();

El código del extension method es el siguiente:

public static void EnsureLoad<T>(this EntityCollection<T> entityCollection)
where T: EntityObject
{
    if (!entityCollection.IsLoaded)
    {
        entityCollection.Load();
    }
}

Bueno, espero que sirva.
Saludos, Gus

2 comentarios:

Anónimo dijo...

Upps gaste 5 minutos de mi tiempo, viendo un absordo metodo extensor.

Anónimo dijo...

No manches, te la rifaste... eres un sabio como pudiste pensar algo tan dificil ???? jajajajajaja

perdon pero no le veo caso a tu codigo.