2010-03-22 6 views
6

Можно ли ограничить количество связанных объектов, с нетерпением загруженных с помощью Include?Селективная загрузка в Entity Framework

например. У меня есть авторские и книжные сущности с отношением «много к одному» Я хотел был бы загрузить всех авторов и их последнюю книгу

Спасибо.

ответ

0

Да, вы можете. Вы сделаете это через два запроса.

Сначала выберите своих авторов.

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

Second select your books.

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

Когда вы сделаете это, EF заполнит вашу книгу для автора. Обратите внимание, что ваша ссылка не будет загружена, но ваша 1 книга будет там.

Попробуйте ... радостное волшебство EF.

0

Я хотел бы сделать это следующим образом:

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

где Автор ваше имя и сущность книги в вашей навигации собственности в Автора. у вас все равно будет EntityCollection для книг, но он должен содержать только один элемент.

+0

Я не верю .INCLUDE ("Книги") необходимо здесь. Любые условные критерии (такие как Take или даже join it's self) указывают EF, что там есть некоторые условия, и он не должен включать все, чтобы исключить .Include. По крайней мере, так я это понимаю, и я много играл с этим синтаксисом. –

3

Вы не можете сделать это, используя синтаксис .Include, но вы можете сделать это с помощью проецирования.

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

Когда вы получите результат, возвращаемый Materializer будет использоваться это отношения Fixup и вы будете иметь возможность использовать list.Author.Books.

см мой вопрос по адресу: LINQ to Entities (Entity Framework) Join and .Include conflict

Смежные вопросы