Вывод данных из трёх таблиц

ADO.NET
  1. 11 месяцев(а)

    Здравствуйте!
    Есть следующая база:
    -image-

    Так я описал связи в классах.
    в Perfomance (спектакли):

            public List<Part> Parts { get; set; }

    в Person (коллектив)

            public List<Part> Parts { get; set; }

    в Part (роли)

            [ForeignKey("PerfomanceId")]
            public Perfomance Perfomance { get; set; }
    
            [ForeignKey("PersonId")]
            public Person Person { get; set; }

    Таблицу с фото делать не стал, т.к. времени на неё уже нет.

    Подскажите пожалуйста как мне вывести на одну страничку данные из всех этих трёх таблиц в таком виде:
    По id спектакля открывается страница спектакля с отображением строк из таблицы Perfomace.
    Ниже выводится список ролей из таблицы Part. Выше описанное у меня получилось. А вот как мне вывести ещё и участников коллектива, которые играли в этом спектакле из таблицы Person. И возможно ли сделать так, чтобы напротив роли было имя актёра, который её сыграл?

    Метод вывода в контроллере:

    private EFDbContext db = new EFDbContext();
            public ActionResult AlonePerfomance (int? perfomanceId = 0)
            {
                if (perfomanceId == null)
                {
                    return HttpNotFound();
                }
                Perfomance perfomance = db.Perfomances
                    .Include(t => t.Parts)
                    .FirstOrDefault(t => t.PerfomanceId == perfomanceId);
                if (perfomance == null)
                {
                    return HttpNotFound();
                }
                return View(perfomance);
            }

    И представление:

    @using Sphere.Domain.Entities
    @model Perfomance
    // ...
        <u>Описание</u>:
        <p>@Model.Description</p>
    
    @foreach (Part p in Model.Parts)
    {
        <li>@p.Role</li>
    }
  2. Alexandr_Erohin

    Jun 20 Администратор
    Добавлено 11 месяцев(а) Alexandr_Erohin

    Откуда берется свойство Part.Role? В любом случае необходимо передавать более сложную модель в представление, предварительно сохраняя в ее свойства список актеров и спектакль:

    public class PerfomanceViewModel
    {
            public List<Person> Persons { get; set; }
            public Perfomance Perfomance { get; set; }
    }

    В контроллере соответственно:

    public ActionResult AlonePerfomance(int? perfomanceId = 0)
    {
                PerfomanceViewModel model = new PerfomanceViewModel();
    
                if (perfomanceId == null)
                {
                    return HttpNotFound();
                }
    
                model.Perfomance perfomance = db.Perfomances
                    .Include(t => t.Parts)
                    .FirstOrDefault(t => t.PerfomanceId == perfomanceId);
    
                if (model.Perfomance == null)
                {
                    return HttpNotFound();
                }
    
                model.Persons = db.Persons.Where(p => p.Id == model.Perfomance.PersonId).ToList();
    
                return View(model);
    }

    В представлении соответственно используются перечисления @Mоdel.Perfomance.Parts и @Mоdel.Persons для актеров. А имя актера в списке с ролями можно загрузить из @Mоdel.Persons, в зависимости от того, какая связь со свойством Part.Role.

  3. Благодарю Вас за быстрый и чёткий ответ.
    И всё же у меня не выходит задуманное, во-первых из-за того, что я привёл старую схему, простите за это (бессонные ночи сказываются), где свойство Part сейчас называется Role, отсюда оно и взялось, во-вторых я не совсем точно истолковал свою мысль.
    PersonId в таблице Perfomance это режиссёр.
    Я хотел, чтобы участники выводились по PersonId таблицы Part. Я пытался это сделать по Вашему примеру, и пока что безуспешно.
    Связь между таблицами Part и Person один-ко-многим, определил я это из условия: можно добавить актёра без роли, а роль без актёра нельзя.
    Вот так выглядит окончательная схема
    -image-

  4. С помощью LINQ у меня не получилось.
    Сделал так:

    private EFDbContext db = new EFDbContext();
            public ActionResult AlonePerfomance (int? perfomanceId = 0)
            {
                PerfomanceViewModel model = new PerfomanceViewModel();
    
                if (perfomanceId == null)
                {
                    return HttpNotFound();
                }
    
                model.Perfomance = db.Perfomances
                    .Include(t => t.Parts)
                    .FirstOrDefault(t => t.PerfomanceId == perfomanceId);
    
                var query = (from s in db.Parts
                             join p in db.Persons on s.PersonId equals p.PersonId
                             where s.PerfomanceId == perfomanceId
                                   select p).ToList();
                model.Persons = query;
    
                if (model.Perfomance == null)
                {
                    return HttpNotFound();
                }
    
                return View(model);
            }

    В представлении вышло вот так:

     @for (int i=0; i<Model.Perfomance.Parts.Count(); i++) 
                {
            <tr>
                <td>
                    @Model.Perfomance.Parts[i].Role
                </td>
                    <td>
                       @Html.ActionLink(@Model.Persons[i].Surname + " " + @Model.Persons[i].Name, "Person", "AlonePerson", new { @Model.Persons[i].PersonId }) 
                    </td>
                </tr>
                }

    P.S. Грязный код конечно, но по другому никак не успевал.
    Благодарю за помощь!

или зарегистрируйтесь чтобы ответить