Не загружать дочернее свойство в память - PullRequest
0 голосов
/ 21 января 2019

У меня есть следующие сущности на 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; }
}

Мне нужно получить список идентификаторов файлов и имен сообщений без загрузки их содержимого в память.

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

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

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

Я думаю, что в тот момент, когда я использую «Включить», файлы будут загружены в память.Нет?

Как правильно получить список идентификаторов и имен файлов сообщений без загрузки их содержимого в память?

1 Ответ

0 голосов
/ 22 января 2019

Мне нужно получить список идентификаторов файлов и имен сообщений, не загружая их содержимое в память.

Как правильно получить список идентификаторов и имен файлов сообщений без загрузки их содержимого в память?

Как только вы сказали, что хотите получить a Post, а затем сказали, что хотите получить a list of Post.

Таким образом, чтобы получить a Post с его файлами (только Id и Name) , вы можете написать свой запрос следующим образом:

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 и Name) , вы можете написать свой запрос следующим образом:

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...