提取Viewmodel所需的精确数据以发送到包含3个模型的视图?

时间:2016-07-08 15:58:19

标签: asp.net-mvc entity-framework linq asp.net-mvc-4

我有3个型号(缩短):

课程模式:

    public int CourseID { get; set; }
    public string Meta { get; set; }
    public string Title { get; set; }
    public string titleabbrev { get; set; }
    public virtual ICollection<course_section> course_sections { get; set; }

课程部分模型:

[Key]
    public int SectionID { get; set; }
    [ForeignKey("Course_page")]
    public int CourseID { get; set; }
    public string Title { get; set; }
    public string Colour_class { get; set; }
    public int Order { get; set; }

    public virtual Course_page Course_page { get; set; }
    public virtual ICollection<course_subsection> course_subsections { get; set; }

课程分段模型:

[Key]
    public int SubSectionID { get; set; }
    [ForeignKey("course_section")]
    public int SectionID { get; set; }
    public string Title { get; set; }
    public string Icon_class { get; set; }
    public string Colour_class { get; set; }
    public string Link { get; set; }
    public int Order { get; set; }
    public string Titleabbrev { get; set; }
    public string Pagecontent { get; set; }

    public virtual course_section course_section { get; set; }

它们组合在viewmodel中:

public class CourseViewModel
{
    public IEnumerable<Course_page> Course_page { get; set; }
    public IEnumerable<course_section> Course_section { get; set; }
    public IEnumerable<course_subsection> Course_subsection { get; set; }
}

在我看来,我有3个foreach循环,旨在按顺序在页面上打印部分和相关小节。

在我的视图控制器中,我有以下内容:

public ActionResult Course_page(string courseabbrev)
    {


        var viewModel = new CourseViewModel();
        viewModel.Course_page = db.Course_page
        .Where(i => i.titleabbrev == courseabbrev)
        .Include(i => i.course_sections.Select(c => c.course_subsections));


       viewModel.Course_section = viewModel.Course_page.Where(i => i.titleabbrev == courseabbrev)
            .Single().course_sections
            .OrderBy(i => i.Order);

        //viewModel.Course_subsection = db.course_subsection.ToList()
        //    .OrderBy(i => i.Order);

        viewModel.Course_subsection = viewModel.Course_section.First().course_subsections;


        return View(viewModel);
    }

我试图发送到视图,只是加载页面时选择的课程的部分和子部分。目前,我可以通过使用上面注释掉的行来显示我想要的页面:

viewModel.Course_subsection = db.course_subsection.ToList()
           .OrderBy(i => i.Order);

然后在我看来,我在第3个foreach循环中使用if语句来匹配viewModel.Course_section中的sectionID和viewModel.Course_subsection中的sectionID,以便它只打印出该部分的相关子部分。

这可行但似乎有点矫枉过正,因为我正在向页面发送所有子部分的列表。

控制器中可以看到的另一种选择是:

 viewModel.Course_subsection = viewModel.Course_section.First().course_subsections;

这只会发回第一组course_subsections,因为我当然使用的是First()。

我的问题是将此数据发送到视图的最佳方法是什么?有没有办法只发送我需要的小节?

由于

1 个答案:

答案 0 :(得分:1)

使用SelectMany

viewModel.Course_subsection = viewModel.Course_section
                                       .SelectMany(c => c.course_subsections);