【问题标题】:How can I return single record of an IEnumerable object as part of my viewmodel?如何将 IEnumerable 对象的单个记录作为视图模型的一部分返回?
【发布时间】:2016-11-22 04:29:07
【问题描述】:

我有一个视图模型:

public class CourseViewModel
{
    public int CourseID { get; set; }
    public string Title { get; set; }
    public string page_title { get; set; }
    public string titleabbrev { get; set; }
    public string Meta { get; set; }
    public string intro_1 { get; set; }
    public string intro_2 { get; set; }
    public string intro_3 { get; set; }
    public IEnumerable<course_section> Course_section { get; set; }
    public IEnumerable<course_subsection> Course_subsection { get; set; }
    public Enrollment Enrollments { get; set; }
}

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

var allcourse = db.Course_page
            .Where(i => i.titleabbrev == courseabbrev)
        .Include(i => i.course_sections.Select(c => c.course_subsections))
        .Include(i => i.enrollments);



        var viewModel = new CourseViewModel();

        viewModel.CourseID = allcourse.Single().CourseID;
        viewModel.page_title = allcourse.Single().page_title;
        viewModel.titleabbrev = allcourse.Single().titleabbrev;
        viewModel.Title = allcourse.Single().Title;
        viewModel.intro_1 = allcourse.Single().intro_1;
        viewModel.intro_2 = allcourse.Single().intro_2;
        viewModel.intro_3 = allcourse.Single().intro_3;

        viewModel.Course_section = allcourse
            .Single().course_sections
            .OrderBy(i => i.Order);


        viewModel.Course_subsection = viewModel.Course_section
            .SelectMany(c => c.course_subsections)
            .Where(i => i.Titleabbrev == sectionabbrev)
            .OrderBy(i => i.Order);


        return View(viewModel);

我想发送到视图 viewmodel.enrollments,但是我在这样做时遇到了问题,因为我只想将单个注册记录发送到 viewmodel 中的视图,并且在 course_page 模型中注册是 IEnumerable。

当我创建“allcourse”时,大概我应该只获取单个注册记录,但是无论我尝试什么,我似乎都无法做到这一点,然后将其返回到视图中。例如,我尝试过:

var allcourse = db.Course_page
            .Where(i => i.titleabbrev == courseabbrev)
            .Where(b => b.enrollments.Single().UserID == User.Identity.GetUserId())
        .Include(i => i.course_sections.Select(c => c.course_subsections))
        .Include(i => i.enrollments);

将视图模型发送到仅包含与当前登录的用户 ID 匹配的注册记录的视图的最佳方式是什么?

编辑 - 我也尝试过:

var allcourse = db.Course_page
            .Where(i => i.titleabbrev == courseabbrev)
            Where(i => i.Enrollments.Any(b => b.UserID == User.Identity.GetUserId())
        .Include(i => i.course_sections.Select(c => c.course_subsections))
        .Include(i => i.enrollments);

在 linqpad 中对此进行测试会返回用户 ID 不匹配的注册记录。

谢谢

【问题讨论】:

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


    【解决方案1】:

    我建议您将起点更改为注册,然后从课程页面和其他链接实体中获取值..

    例如

      var allcourse = db.Enrollments
            .Where(e => e.UserID == User.Identity.GetUserId())
            .Select(x => new CourseViewModel { 
    
        CourseID = e.Course_page.CourseID,
        ...
        ...
    
        Course_section = e.Course_page.course_sections.OrderBy(i => i.Order).FirstOrDefault
        ...
        ...
        ...
            });
    

    【讨论】:

    • 现在我想起来,这完全有道理。谢谢你的回答。
    【解决方案2】:

    试试这个查询:

    var userId = User.Identity.GetUserId();
    
    var viewModel = db.Course_page
        .Where(i => i.titleabbrev == courseabbrev)
        .Where(i => i.Enrollments.Any(b => b.UserID == userId))
        .Select(e => new CourseViewModel{
            CourseID = e.CourseID,
            page_title = e.page_title,
            titleabbrev = e.titleabbrev,
            Title = e.Title,
            intro_1 = e.intro_1,
            intro_2 = e.intro_2,
            intro_3 = e.intro_3, 
            Course_section = e.course_sections.OrderBy(i => i.Order)
                .ToList(),
            Course_subsection = e.course_sections
                .SelectMany(c => c.course_subsections)
                    .Where(i => i.Titleabbrev == sectionabbrev)
                    .OrderBy(i => i.Order).ToList()           
        }).Single();
    

    【讨论】:

    • 感谢您的回复,我在 Course_subsection = e.Course_section 行有一个错误,course_page 不包含 course_section 的定义。此外,我没有看到我在哪里将注册限制为一条记录,一条与用户 ID 匹配的记录。
    猜你喜欢
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 2011-06-14
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多