EF嵌套表急切加载?

时间:2013-03-14 10:24:24

标签: c# entity-framework lambda eager-loading

我的表关系:

Categories有许多Posts有很多PostImages

我想检索类别> LastPost> FirstPostImage。我尝试了类似的事情:

var categories = entity.Categories
                 .Where(x => x.PositionId == 2)
                 .Include(x => x.Posts.Last())
                 .Include(x => x.Posts.Last().PostImages.First())
                 .Take(5)
                 .ToList();

问题:有没有一种优雅的方式来实现这个目标?是否通常使用嵌套关系表的预先加载?

2 个答案:

答案 0 :(得分:2)

EF不支持对包含的表进行查询,但您可以使用Select子句进行子查询:

var categories = entity.Categories
  .Where(x => x.PositionId == 2)
  .Select( x => new {
    Category = x,
    LastPost = x.Posts.Last(),
    FirstImage = x.Posts.Last().PostImages.First(),
  })
  .Take(5)
  .ToList();

您最终会获得List<anonymous>,但它会获得您需要的数据。

答案 1 :(得分:1)

我建议您使用数据传输对象(DTO)。只需创建新类:

public class CategoriesPostPostImagesDto
{
     public Categories Category {get;set;}
     public Posts Post {get;set;}
     public PostImages PostImage {get;set;}

}

然后从DB中选择数据。

List<CategoriesPostPostImagesDto> data = entity.Categories
  .Where(x => x.PositionId == 2)
  .Select( x => new CategoriesPostPostImagesDto(){
    Category = x,
    Post = x.Posts.Last(),
    PostImage = x.Posts.Last().PostImages.First(),
  })
  .Take(5)
  .ToList();

互联网上有很多关于DTO的信息:

像这样: ADO.NET EF - populate DataGridView when we have Foreign Key