1

我需要在视图中显示一些父子关系数据。以下是我的代码:

@model PagedList.IPagedList<Test.Domain.TestTable> 
<table width="100%">
    <tr>
        <td>Name</td>
        <td>Parent</td>
    </tr>
    @foreach (var item in Model)
    {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Name)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.ParentID)
        </td>
    </tr>
    }
    <tr>
        <td>
            Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) of @Model.PageCount
            -----------------
            -----------------
        </td>
    </tr>
</table>

现在我想显示父名称而不是父 ID,它在数据库中具有以下结构:
ID Name ParentID
1   John    Null
2   Dean   1
3   Sam    1


为了显示父名称,我尝试了以下代码,但这些都不起作用:

  • @Model.Where(screenParent => screenParent.ID == item.ParentID).Select(screenParent => new { screenParent.Name})
    它显示 System.Linq.Enumerable+WhereSelectEnumerableIterator`2[Test.Domain.TestTable,<>f__AnonymousType5`1[System.String]]

您能建议为什么它显示在代码行上方吗?
还可以做些什么来实现父名称而不是父 ID。
提前致谢。

4

1 回答 1

1

在这里做几个假设。

您的模型上是否有 Parent 的属性,或者您只是拉入 ParentID?如果您只输入 ID,我建议您更改模型/映射,以便您通过 FK 提取整个对象引用。

如果您已经在拉入整个 Parent 对象,请知道实体框架不会自动为您延迟加载您的 Parent 。您必须在查询 TestTable 时明确告诉它加载它。

您可以通过 2 种不同的方式执行此操作。

  1. 使您的父属性虚拟。IE

    公共虚拟测试表父{获取;放; }

    然后,当您尝试访问 TestTable.Parent 时,它将从数据库中加载。这将允许您访问该名称。

  2. 查询测试表时显式加载父级,即

    myDBContext.TestTables.Include("YourParentPropertyName").Where(....);

您视图中的最终结果将如下所示:

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

让我知道这是否有帮助。

于 2012-12-11T14:29:30.507 回答