図書館<本棚<本 という構造を、Controllerから渡してViewで処理をする場合。

Viewでは以下のようにしますの。

@model IEnumerable<プロジェクト名.Models.図書館>
@foreach (var 本棚 in Model.本棚s){
    @foreach (var 本 in 本棚.本s){
         @Html.DisplayFor(x => x.書名)
    }
}

※Controllerから送られた情報は、Modelというオブジェクトに入っている決まりで、「@model~」は、そのオブジェクトの型の指定ですの。(*1)


Controllerのほうでは、以下のようにしますの。

public async Task Index(){
    return View(await _context.図書館
        .Include(x => x.本棚)
        .ThenInclude(x => x.本)
        .ToListAsync());
}


ここで少しわかりにくいのが.Include()で、これは「関連オブジェクトの内容も一緒に読み込むための指定」ですの。逆に言うと、これをしないとViewで本棚sの内容を見ようとしたときにnull例外が出ますの。(*2)

同様に、.ThenInclude()は「関連オブジェクトの関連オブジェクトの内容も一緒に読み込むための指定」ですの。例では孫オブジェクトの指定に使っているけれども、ひ孫オブジェクトの指定でも同様に繋げていけばいいはずですの。たぶん。

ちなみに、.ThenInclude()での指定時は、VisualStudioのバージョンによっては、正しく指定していても構文エラーの表示がされることがあり、その場合は無視して良いそうですの。

VS2017で試したところでは、エラーにはならなかったけどコード補完は上手く効いていないようでしたの(=「x.」まで打っても候補に「本」が出てこなかったですの)。

参考

UWPでEntity Framework OneToMany
http://blog.okazuki.jp/entry/2016/03/12/093957

関連データの読み込み
https://docs.microsoft.com/ja-jp/ef/core/querying/related-data


*1) ただの型指定なので、「@model~」の記載自体で情報を受け取っているわけでは(たぶん)無いですの。

*2) 本棚sがnullなのか、本棚の内容がnullだったのかは未調査ですの。ただ、foreachで回そうとしたときに落ちたので、たぶん、本棚sごとnullになるのだと思いますの。

0 コメント: