对外键相关数据进行分组,以便在 View 中按类别名称对数据进行分组



我正在尝试在控制器中组织分组数据以在我的视图中使用。


我有以下解决方案,但收到以下错误:

"已经有一个与此命令关联的打开的 DataReader,必须先关闭它。"


给定 2 组相关数据:一组问题及其所属的类别,由以下类表示

Category
Question

我想按类别对问题进行分组,通过外键连接

categoryId

下面是一些示例数据:

类别

category1 { Id = 1, Name = "Info about you" }
category2 { Id = 2, Name = "Info about your pet" }

问题

question1 { categoryId = 1, Text = "What's your name?" }
question2 { categoryId = 1, Text = "What's your age?" }
question3 { categoryId = 2, Text = "What kind of pet do you have?"
question4 { categoryId = 2, Text = "What color is your pet?"

所需的 HTML 输出将是这样的

关于您的信息

  • 你叫什么名字?
  • 你多大了?

有关您宠物的信息

  • 你有什么样的宠物?
  • 你的宠物是什么颜色的?

所以我的想法是将类别名称和相关问题的信息放入 ViewModel 中,如下所示:

public class CategoriesWithQuestions() {
    public string Name { get; set; }
    public IEnumerable<Question> Questions { get; set; }
}

然后在我的控制器中,我会使用查询将数据放入 ViewModel:

public ActionResult MyAction() {
    var categoriesWithQuestions =
        db.Categories()
            .Select(category => new CategoriesWithQuestions()
            {
                Name = category.Name,
                Questions = db.Questions().Where(Queryable => q.CategoryId == category.Id)
            });
    return View(categoriesWithQuestions);
}

并在视图中使用 ViewModel,方法是循环访问类别的名称属性和关联的问题,这两个访问器都是 ViewModel 类中的访问器:

@model IEnumerable<App.ViewModels.CategoriesWithQuestions>
...
@foreach (var category in Model)
{
    <h3>@category.Name</h3>
    <ul>
    @foreach (App.Models.Question Question question in category.Questions)
    {
        <li>@question.Text</li>
    }
    </ul>
}

名称正常,但在尝试访问视图中的问题时会发生错误。

对修复我当前解决方案或替代(更好)解决方案的想法持开放态度。

试试这个

public ActionResult MyAction() {
    var categoriesWithQuestions = 
        from c in db.Categories()
        join q in db.Questions() on c.Id equals q.CategoryId into lj
        from q in lj.DefaultIfEmpty()
        group new {q,c} by c into grp
        select new CategoriesWithQuestions
        {
            Name = grp.Key.Name,
            Questions = grp.Select(x=>x.q)
        } 
    return View(categoriesWithQuestions);
}

相关内容

  • 没有找到相关文章

最新更新