2010-03-22 17 views
6

¿Es posible limitar el número de entidades asociadas cargadas ansiosamente con Include?Carga ansiosa selectiva en Entity Framework

p. Ej. Tengo entidades de Autor y Libro con una relación uno a uno Me gustaría cargar todos los autores y su último libro

Gracias.

Respuesta

0

Sí, puedes. Lo vas a hacer a través de dos consultas.

Primero seleccione sus autores.

List<Authors> authors = context.Authors.ToList(); 

Segundo seleccione sus libros.

List<Books> books= 
        ( from b in context.Books 
          group b by b.AuthorName into groupedByAuthor 
          let maxDate = groupedByAuthor.Max(c=>c.PublishDate) 
          ... 
        ).ToList 

Cuando hagas esto, EF completará tu libro para el autor. Tenga en cuenta que su referencia no estará "cargada", pero su 1 libro estará allí.

Pruébalo ... la magia alegre de EF.

0

lo haría así:

var list = (from a in Authors.Include("Books") 
      join b in books.OrderByDesc(b => b.PublishedDate).Take(1) 
       on a.Id equals b.AuthorId into bo 
      select new { Author = a, Books = b }).ToList(); 

List<Author> authors = list.Select(o => o.Author); 

Cuando el Autor es el nombre de la entidad y los libros en su navegación por la propiedad de Autor. aún tendrá una EntityCollection for Books pero solo debe contener 1 elemento.

+0

No creo que la .include ("Libros") es necesario en este caso. Cualquier criterio condicional (como Take o incluso Join it's self) le dice a EF que hay algunas condiciones allí y que no debe incluir todo, por lo que el .Include se descarta. Al menos así es como lo entiendo y he jugado bastante con esa sintaxis. –

3

No puede hacerlo utilizando la sintaxis .Include, pero puede hacerlo mediante proyección.

var list = (from a in data.Authors 
      select new 
      { 
       Author = a, 
       Books = (from b in a.Books select b).Take(1) 
      }).ToList(); 

Cuando se obtiene el resultado de la materializador habrá utilizado es la relación de corrección y usted será capaz de utilizar list.Author.Books.

ver mi pregunta en: LINQ to Entities (Entity Framework) Join and .Include conflict

Cuestiones relacionadas