首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVC3和EF5:在视图中包括子实体和GrandChild实体

MVC3和EF5:在视图中包括子实体和GrandChild实体
EN

Stack Overflow用户
提问于 2013-03-09 06:12:30
回答 1查看 639关注 0票数 0

为了简单起见,我有三个实体(一对多,从左到右):

课程->模块->章节

一个课程可以有多个模块,一个模块可以有多个章节。

我在控制器里只有以下几个:

代码语言:javascript
复制
Course course = db.Courses.Find(id);
return View(course);

我试图使用一个包含,但它似乎没有评估(这似乎不起作用:Course course = db.Courses.Include("Modules").Find(id);)

所以我就听之任之。在我看来,我有一个嵌套列表:

代码语言:javascript
复制
<ul>
    @foreach (var item in Model.Modules)
    {
    <li>@module.Title
        <ul>
        @foreach (var item in module.Chapters)
        {
        <li>@chapter.Title</li>
        }
        </ul>
    </li>
    }
</ul>

这会自动工作吗?

最后,我应用了一个SortOrder列,以便能够安排子实体。我知道这应该在查询中完成,但是我怎么做呢?

谢谢!如能提供任何信息或建议,将不胜感激。

更新

课程类

代码语言:javascript
复制
public partial class Course
{
    public Course()
    {
        this.Modules = new HashSet<Module>();
        this.Assets = new HashSet<Asset>();
    }

    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string Author { get; set; }
    public System.DateTime CreateDate { get; set; }
    public bool IsDeleted { get; set; }
    public int IndustryId { get; set; }

    public virtual ICollection<Module> Modules { get; set; }
    public virtual ICollection<Asset> Assets { get; set; }
    public virtual Industry Industry { get; set; }
}

模块类

代码语言:javascript
复制
namespace RocketLabs.Models
{
    using System;
    using System.Collections.Generic;

    public partial class Module
    {
        public Module()
        {
            this.Chapters = new HashSet<Chapter>();
            this.Assets = new HashSet<Asset>();
        }

        public int Id { get; set; }
        public string Title { get; set; }
        public System.DateTime CreateDate { get; set; }
        public int CourseId { get; set; }
        public bool IsDeleted { get; set; }
        public short SortOrder { get; set; }

        public virtual Course Course { get; set; }
        public virtual ICollection<Chapter> Chapters { get; set; }
        public virtual ICollection<Asset> Assets { get; set; }
        public virtual Exam Exam { get; set; }
    }
}

章节类

代码语言:javascript
复制
namespace RocketLabs.Models
{
    using System;
    using System.Collections.Generic;

    public partial class Chapter
    {
        public Chapter()
        {
            this.Assets = new HashSet<Asset>();
        }

        public int Id { get; set; }
        public string Title { get; set; }
        public int ModuleId { get; set; }
        public string Notes { get; set; }
        public short SortOrder { get; set; }
        public System.DateTime CreateDate { get; set; }
        public bool IsDeleted { get; set; }

        public virtual Module Module { get; set; }
        public virtual ICollection<Asset> Assets { get; set; }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-09 07:07:52

你可以这样做:

代码语言:javascript
复制
var course = db.Courses
               .Include(i => i.Modules.Select(s => s.Chapter))
               .Single(s=>s.Id == id);
return View(course);

你的循环:

代码语言:javascript
复制
<ul>
    @foreach (var module in Model.Modules)
    {
        <li>@module.Title
            <ul>
                @foreach (var chapter in module.Chapters)
                {
                    <li>@chapter.Title</li>
                }
            </ul>
        </li>
     }
</ul>

至于排序,我们可以在查询中包括.OrderBy(),但是您需要详细说明您想要排序的子实体以及哪个字段。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15307875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档