实体框架中的选择性预先加载

时间:2010-03-22 12:20:28

标签: c# entity-framework

是否可以限制急切加载Include的关联实体的数量?

e.g。 我有与多对一关系的Author和Book实体 我想加载所有作者和他们的最后一本书

感谢。

3 个答案:

答案 0 :(得分:3)

您无法使用.Include语法执行此操作,但您可以使用投影执行此操作。

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

当你得到结果时,物化者将使用它的关系修正,你就可以使用list.Author.Books。

在以下位置查看我的问题: LINQ to Entities (Entity Framework) Join and .Include conflict

答案 1 :(得分:0)

是的,你可以。你将通过两个查询来完成它。

首先选择你的作者。

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

第二次选择你的书。

    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的欢乐魔力。

答案 2 :(得分: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 for Books但它应该只包含1个元素。