Asp.net mvc 如何在MVC索引页中显示导航属性集合中的值

Asp.net mvc 如何在MVC索引页中显示导航属性集合中的值,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,我有一个名为“JobTitle”的EF实体类型,它有一个名为“Office”的导航属性,它是另一个名为“Office”的实体类型的集合 我想在我的索引视图中显示职务名称和相关办公室名称的列表。 默认情况下,视图脚手架生成了以下内容: @model IEnumerable<Example.Models.JobTitle> @{ ViewBag.Title = "Index"; } <h2>Index</h2> <table> &

我有一个名为“JobTitle”的EF实体类型,它有一个名为“Office”的导航属性,它是另一个名为“Office”的实体类型的集合

我想在我的索引视图中显示职务名称和相关办公室名称的列表。 默认情况下,视图脚手架生成了以下内容:

@model IEnumerable<Example.Models.JobTitle>

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<table>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.JobTitleName)
        </th>

    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.JobTitleName)
        </td>

    </tr>
}

</table>
这将允许我生成属于“JobTitle”的所有简单属性,例如“JobTitleName”。但是,我无法确定如何将“Office”集合导航属性中相应的“Office”信息检索到我的视图中

因此,我希望最后能显示两列:“JobTitle”和“Office”

在我的数据库中,这些实体由三个表表示:JobTitle JobTitleID、JobTitleName、Office OfficeID、OfficeName和JobTitleOffice JobTitleID、OfficeID

我是MVC和实体框架的新手,所以非常感谢您的帮助


谢谢

您可以使用和将结果投影到JobTitleName和OfficeName的集合中

更多


将来,如果有这样的问题,最好发布实际的实体类。然而,根据您的表格,看起来您的职位和办公室之间存在多对多关系。您的困难很可能与如何访问特定JobTitle实例的OfficeName属性有关,问题在于OfficeName不只是一个,而是很多。你需要反复浏览办公室列表

或者,如果您只关心显示单个办公室的名称,则可以使用FirstOrDefault拉出单个办公室:

<td>
    @Html.DisplayFor(modelItem => item.JobTitleName)
    @{
        var office = item.Offices.FirstOrDefault();
        if (office != null)
        {
            @Html.DisplayFor(m => office.OfficeName);
        }
    }
</td>
如果您尝试执行以下操作:

@foreach (var office in item.Offices)
{
    @office.OfficeName
    <address>
        @office.Address.Street
        ...
    </address>
}

这将导致实体框架进行连接,将办公室和每个办公室实例的每个地址都包含在查询中,以获取职务。然后,您可以根据需要对这些信息执行任何操作,而无需担心会发出多个附加查询。

谢谢Chris,非常有用的解释。
public class JobTitle
{
    // other properties
    public string JobTitleName { get; set; }
    public virtual ICollection<Office> Offices { get; set; }
}
public class Office
{
    // other properties
    public string OfficeName { get; set; }
    public virtual ICollection<JobTitle> JobTitles { get; set; }
}
<td>
    @Html.DisplayFor(modelItem => item.JobTitleName)
    @foreach (var office in item.Offices)
    {
        @Html.DisplayFor(m => office.OfficeName)
    }
</td>
<td>
    @Html.DisplayFor(modelItem => item.JobTitleName)
    @string.Join(", ", item.Offices.Select(m => m.OfficeName))
</td>
<td>
    @Html.DisplayFor(modelItem => item.JobTitleName)
    @{
        var office = item.Offices.FirstOrDefault();
        if (office != null)
        {
            @Html.DisplayFor(m => office.OfficeName);
        }
    }
</td>
public class Office
{
    ...

    public virtual Address Address { get; set; }
}
@foreach (var office in item.Offices)
{
    @office.OfficeName
    <address>
        @office.Address.Street
        ...
    </address>
}
return View(db.JobTitles.Include("Offices.Address").ToList());