Запрашивать сущности родитель-потомок с отношениями «один-много» и извлекать дочерние записи на основе значений в родительской записи, используя LINQ to Entities. - PullRequest
0 голосов
/ 07 июня 2019

У меня есть приложение Asp.net MVC, которое имеет 3 класса; Событие, Модификация, FieldHistory. У событий есть один-много с Модификациями, а у Модификаций также есть одно-много-много отношений с FieldHistory.

Класс мероприятия:

public class Event
{
    public int EventId { get; set; }
    public string EventName { get; set; }
    public DateTime? EventDate { get; set; }
}

Класс модификации:

public class Modification
{
    public int ModificationId { get; set; }

    public int EventId { get; set; }
    public virtual Event Event { get; set; }

    public string ModificationStatus { get; set; }
}

Класс FieldHistory:

public class FieldHistory
{

    public int FieldHistoryId { get; set; }

    public int ModificationId { get; set; }
    public virtual Modification Modification { get; set; }

    public int PropValId { get; set; }

    public int KeyFieldId { get; set; }
    public string FieldName { get; set; }
    public string Instructions { get; set; }
    public string Format { get; set; }
}

В одном из действий Индекса я возвращаю IEnumerable of Modification в представление и представляю их как элементы списка на странице индекса.

    public async Task<ActionResult> Index()
    {
        var modifications = _applicationDbContext.Modifications.Include(m 
=> m.Event)
                                .Include(m => m.ItemType)
                                .Include(m => m.ModificationType)
                                .OrderByDescending(m => m.CurrentUserId);


        return View(await modifications.ToListAsync());
    }

Я хотел бы расширить этот запрос, чтобы теперь я также показывал Модификации вместе с одной из ее дочерних записей, основанных на поле ModificationStatus объекта Модификация. Например, если для состояния модификации указано «Создание» или «Создано», загрузите FieldHistory с PropValId, равным 1, в противном случае, если статус «Обрабатывается» или «Утверждено», загрузите FieldHistory для PropValId, равного 2, в качестве его дочернего элемента. Таким образом, в элементе списка у меня должны быть все 3 объекта в записи: Событие, Модификация, FieldHistory

Я только начинающий в Linq и надеюсь, что это может быть еще одним большим шагом для меня.

1 Ответ

0 голосов
/ 09 июня 2019

Не уверен, есть ли прямой способ связать в ModificationStatus с PropValId, поэтому вместо этого просто используйте то, что вы передали выше, и, очевидно, вы должны будете предоставить дополнительные правила, если есть больше ... также только собирается взять Первый один из других типов объектов, но вы можете изменить его, если вам нужны все связанные с ним ...

Я забираю изменения вашей переменной, как определено выше, и, конечно, предполагая,имена таблиц в вашем DbContext, содержащих другие объекты:

    var trios = modifications.Select(m => new { Modification = m, // select the modification obj itself
       FieldHistory = _applicationDbContext.FieldHistories.FirstOrDefault(fh =>
           fh.ModificationId == m.ModificationId && // I am assuming this is required
           fh.PropValId == (new List<string> {"Creating", "Created"}.Contains(m.ModificationStatus) ? 1 : 2)),
       Event = _applicationDbContext.Events.FirstOrDefault(e => e.EventId == m.EventId)
    }).ToList();

Это вернет то, что вы ищете.Если вы хотите, вы можете создать класс, например:

public class Trio {

    public Modification Modification { get; set; }
    public FieldHistory FieldHistory { get; set; }
    public Event Event { get; set; }

    public Trio (Modification modification, FieldHistory fieldHistory, Event @event)
    {
        this.Modification = modification; 
        this.FieldHistory = fieldHistory;
        this.Event = @event;
    }
}

Затем изменить на:

    var trios = modifications.Select(m => new Trio(m, // select the modification obj itself
       _applicationDbContext.FieldHistories.FirstOrDefault(fh =>
           fh.ModificationId == m.ModificationId && // I am assuming this is required
           fh.PropValId == (new List<string> {"Creating", "Created"}.Contains(m.ModificationStatus) ? 1 : 2)),
       _applicationDbContext.Events.FirstOrDefault(e => e.EventId == m.EventId)
    )).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...