В зависимости от того, что нужно вашему потребителю, вы используете .Select()
, чтобы сообщить EF, какие данные вы хотите получить. Это может быть как реляционная модель данных, или вы можете свести данные из иерархии в более простую структуру.
Например, учитывая:
await this.Context.TopLevel
.Include(c1 => c1.Child1).ThenInclude(gc1 => gc1.GrandChild1)
.FirstAsync(tl => tl.TopLevelId == topLevelId);
Предполагается, что GrandChild1 является Документом с байтовым массивом.
public class TopLevelViewModel
{
public int TopLevelId { get; set; }
public int Child1Id { get; set; }
public string DocumentName { get; set; }
public string FileName { get; set; }
}
await this.Context.TopLevel
.Select(x => new TopLevelViewModel
{
TopLevelId = x.TopLevelId,
Child1Id = x.Child1.Child1Id,
DocumentName = x.Child1.Grandchild1.DocumentName,
FileName = x.Child1.GrandChild1.FileName
}).SingleAsync(x => x.TopLevelId = topLevelId);
Если дочерние элементы представляют коллекцию 1-ко-многим, вы можете определить ChildViewModel с соответствующими деталями документа:
public class TopLevelViewModel
{
public int TopLevelId { get; set; }
public ICollection<Child1ViewModel> Children { get; set; } = new List<Child1ViewModel>();
}
public class Child1ViewModel
{
public int Child1Id { get; set; }
public string DocumentName { get; set; }
public string FileName { get; set; }
}
await this.Context.TopLevel
.Select(x => new TopLevelViewModel
{
TopLevelId = x.TopLevelId,
Children = x.Child1s.Select( c => new Child1ViewModel
{
Child1Id = c.Child1Id,
DocumentName = c.Grandchild1.DocumentName,
FileName = c.GrandChild1.FileName
}).ToList()
}).SingleAsync(x => x.TopLevelId = topLevelId);
Вы можете структурировать отношения и данные так, чтобы их можно было использовать по своему усмотрению. Преимущества состоят в том, что вы извлекаете только те поля данных, которые вам нужны, что может уменьшить размер полезной нагрузки для повышения производительности, использовать индексы в базе данных и не раскрывать потребителю слишком много информации о вашей структуре данных.