web-dev-qa-db-ja.com

linqを使用して2つのテーブル(結合)からデータを取得し、結果をビューに返す

ProjectsとProjectsDataの2つのテーブルがあり、結合を使用してクエリを実行し、ビューで結果を取得します。

コントローラには次のコードがあります:

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
}

しかし、それは動作しません...

16
Jacob Jedryszek

あなたの見解では、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>
}
43
Darin Dimitrov