Подтвердить что ты не робот

Получать данные из двух таблиц (join) с linq и возвращать результат в представлении

У меня есть две таблицы: Projects и ProjectsData, и я хочу выполнить запрос с объединением и получить результат в представлении.

В контроллере у меня есть этот код:

ViewBag.projectsData = (from pd in db.ProjectsData
                                   join p in db.Projects on pd.ProjectId equals p.ID
                                   where pd.UserName == this.HttpContext.User.Identity.Name 
                                   orderby p.Name, p.ProjectNo
                                   select new { ProjectData = pd, Project = p });

Что я должен использовать в представлении, чтобы извлечь эти данные. Я попробовал это:

@foreach (var item in ViewBag.projectsData)
{
    @item.pd.UserName
}

но он не работает...

4b9b3361

Ответ 1

В вашем представлении вы пытаетесь получить доступ к свойству pd, но такого свойства не существует. Свойство называется ProjectData.

Говоря об этом, я настоятельно рекомендую вам использовать модели просмотра и строго типизированные представления вместо ViewBag. Таким образом, вы также получите Intellisense в своем представлении, которое поможет вам выбрать правильные имена.

Итак, вы можете начать с определения модели представления, которая будет содержать всю информацию, которая вам нужна:

public class MyViewModel
{
    public ProjectData ProjectData { get; set; }
    public Project Project { get; set; }
}

а затем внутри действия вашего контроллера заселите эту модель представления и перейдите к представлению:

public ActionResult Index()
{
    var viewModel = 
        from pd in db.ProjectsData
        join p in db.Projects on pd.ProjectId equals p.ID
        where pd.UserName == this.HttpContext.User.Identity.Name 
        orderby p.Name, p.ProjectNo
        select new MyViewModel { ProjectData = pd, Project = p };
    return View(viewModel);
}

и, наконец, внутри вашего строго типизированного представления используйте модель представления:

@model IEnumerable<AppName.Models.MyViewModel>
@foreach (var item in Model)
{
     <div>@item.ProjectData.UserName</div>
}