2010-03-22 11 views
6

Ist es möglich, die Anzahl der verbundenen Unternehmen mit einbeziehen geladen mit Spannung zu begrenzen?Selective eifrig Laden in Entity Framework

z.B. Ich habe Autor und Buch-Entitäten mit einer viele-zu-eins-Beziehung Ich möchte alle Autoren und ihr letztes Buch laden

Danke.

Antwort

0

Ja, Sie können. Sie werden es durch zwei Abfragen tun.

zuerst Ihre Autoren wählen.

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

Zweitens wählen Sie Ihre Bücher.

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

Wenn Sie dies tun, füllt EF Ihr Buch für den Autor. Beachten Sie, dass Ihre Referenz nicht "geladen" wird, aber Ihr 1 Buch wird da sein.

Probieren Sie es aus ... die freudige Magie von EF.

0

ich es so tun würde:

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

wo Autor Ihr Unternehmen Name und Bücher in Ihrer Navigation Property in Autor ist. Sie haben immer noch eine EntityCollection für Bücher, aber es sollte nur 1 Element enthalten.

+0

Ich glaube nicht, das .INCLUDE ("Bücher") ist hier notwendig. Jedes bedingte Kriterium (wie ein Take oder sogar das Join it's self) teilt EF mit, dass dort einige Bedingungen vorhanden sind und es sollte nicht alles enthalten, so dass das .Include gelöscht wird. Zumindest verstehe ich das und ich habe mit dieser Syntax ziemlich viel gespielt. –

3

Sie können es nicht tun, um die .INCLUDE Syntax aber man kann es Projektion tun.

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

Wenn Sie das Ergebnis der Materialisierer bekommen es Fixup Beziehung verwendet haben, und Sie werden in der Lage sein list.Author.Books zu verwenden.

siehe meine Frage an: LINQ to Entities (Entity Framework) Join and .Include conflict