不将子属性加载到内存中

时间:2019-01-21 17:50:30

标签: entity-framework-core

在Entity Framework Core 2.2上,我具有以下实体:

public class Post {
  public Int32 Id { get; set; }
  public string Type { get; set; }
  public virtual Collection<File> Files { get; set; }
}

public class File {
  public Int32 Id { get; set; }
  public Int32 PostId { get; set; }
  public String Name { get; set; }
  public Byte[] Content { get; set; }
  public virtual Post Post { get; set; }
}

我需要获取文件ID和帖子名称的列表,而无需将其内容加载到内存中。

  IQueryable<Post> posts = _context.Posts.AsNoTracking();

  posts = posts.Include(x => x.File);

  var files = await posts
    .Where(x => x.Type == "design")
    // Remaining Query

我认为使用“包含”的瞬间文件将被加载到内存中。不?

获取帖子文件ID和名称列表而不将其内容加载到内存中的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

  

我需要获取文件ID和帖子名称的列表,而无需将其内容加载到内存中。

     

获取帖子文件ID和名称列表而不将其内容加载到内存中的正确方法是什么?

一旦您说要获得a Post,然后又说要获得a list of Post

因此,要获取a Post及其文件(仅ID和名称),您可以按以下方式编写查询:

var post = await _context.Posts.Where(yourCondition).Select(p => new
                {
                   p.Id,
                   p.Type
                   Files = p.Files.Select(f => new {f.Id,f.Name}).ToList()
                }).FirstOrDefaultAsync();

要获取list of Posts及其文件(仅ID和名称),您可以按以下方式编写查询:

var posts = await _context.Posts.Where(yourCondition).Select(p => new
                {
                   p.Id,
                   p.Type
                   Files = p.Files.Select(f => new {f.Id,f.Name}).ToList()
                }).ToListAsync();

注意:如果需要强类型输入,则可以编写如下:

Post post = await _context.Posts.Where(yourCondition).Select(p => new Post
                    {
                       Id = p.Id,
                       Type = p.Type
                       Files = p.Files.Select(f => new File {f.Id,f.Name}).ToList()
                    }).FirstOrDefaultAsync();