2010-03-22 5 views
6

Est-il possible de limiter le nombre d'entités associées très chargées avec Include?Chargement passionné sélectif dans Entity Framework

par exemple. J'ai des entités Auteur et Livre avec une relation plusieurs-à-un Je voudrais charger tous les auteurs et leur dernier livre

Merci.

Répondre

0

Oui, vous pouvez. Vous allez le faire à travers deux requêtes.

Sélectionnez d'abord vos auteurs.

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

Deuxièmement, sélectionnez vos livres.

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

Lorsque vous faites cela, EF remplira votre livre pour l'auteur. Notez que votre référence ne sera pas "chargée" mais votre 1 livre sera là. Essayez-le ... la joyeuse magie d'EF.

0

Je ferais comme ça:

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

où Auteur est votre nom d'entité et livres dans votre navigation Propriété Auteur. vous aurez toujours un EntityCollection pour Books mais il ne devrait contenir qu'un seul élément.

+0

Je ne crois pas que le .include ("Livres") est nécessaire ici. Tout critère conditionnel (comme un Take ou même le joint lui-même) indique à EF qu'il y a des conditions à cet endroit et qu'il ne doit pas inclure tout, de sorte que .Include est supprimé. Au moins c'est comme ça que je le comprends et j'ai beaucoup joué avec cette syntaxe. –

3

Vous ne pouvez pas le faire en utilisant la syntaxe .Inclure mais vous pouvez le faire en utilisant la projection.

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

Lorsque vous obtenez le résultat le materializer aura utilisé sa relation fixup et vous serez en mesure d'utiliser list.Author.Books.

voir ma question: LINQ to Entities (Entity Framework) Join and .Include conflict

Questions connexes