Как исключить столбец в объекте «ThenInclude» в запросе выбора Entity Framework - PullRequest
0 голосов
/ 29 мая 2019

Я делаю сложный запрос выбора Entity Framework и хочу исключить один конкретный столбец в объекте, который называется «ThenIncluded».

Я пытался найти решение в StackOverflow, но никто не подходитмой сложный запрос.

Вот запрос:

// topLevelId is given when we get here
await this.Context.TopLevel
                .Include(c1 => c1.Child1)
                .Include(c2 => c2.Child2)
                .Include(c3 => c3.Child3)
                .Include(c4 => c4.Child4).ThenInclude(gc1 => gc1.GrandChild1)
                .Include(c4 => c4.Child4).ThenInclude(gc2 => gc2.GrandChild2)
                .Include(c4 => c4.Child4).ThenInclude(gc3 => gc3.GrandChild3)
                .FirstAsync(tl => tl.TopLevelId == topLevelId);

Объект "ThenIncluded", из которого мне нужно исключить столбец, это GrandChild1 , который относится к этому типу.:

public partial class Document
{
    public Document()
    {
        this.MyType = new HashSet<MyType>();
    }

    public Guid DocumentId { get; set; }
    public string DocumentName { get; set; }
    public string FileName { get; set; }
    public string MimeType { get; set; }
    public byte[] Data { get; set; }

    public ICollection<MyType> MyType { get; set; }
}

И столбец, который я хочу исключить, это Данные (байтовый массив).

Примечание: этот столбец мне нужен в других запросах и обновлениях, поэтомуЯ не могу игнорировать столбец из моей модели EF.

1 Ответ

0 голосов
/ 30 мая 2019

В зависимости от того, что нужно вашему потребителю, вы используете .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);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...