在MVC C#中如何合并两个查询结果得到单个List集合
解决方案
- 推荐采用ViewModel视图模型的方式实现合并,这是ASP.NET MVC开发中传递组合数据的标准规范,类型安全且便于视图绑定。
步骤1:创建视图模型类
// 可放在项目Models文件夹下的ViewModel目录中 public class QuestionWithAnswerCountVM { public Question QuestionInfo { get; set; } public int AnswerCount { get; set; } // 也可根据视图需要直接展开Question的字段,比如public int QuestionId {get;set;} 等 }
步骤2:优化控制器查询逻辑(推荐)
直接单次关联查询得到合并后的列表,避免两次查询存在的顺序匹配风险,性能更优:
public IActionResult Open(int? id) { // 先校验参数合法性 if (!id.HasValue) { return BadRequest(); } var combinedList = (from q in _context.Questions where q.CategoryId == id.Value join a in _context.Answers on q.ID equals a.QId into answerGroup select new QuestionWithAnswerCountVM { QuestionInfo = q, AnswerCount = answerGroup.Count() }).ToList(); if (!combinedList.Any()) { return NotFound(); } return View(combinedList); }
- 如果你需要直接合并现有已经查询得到的两个列表,由于两个列表顺序是一一对应的(answers列表是按照questions列表的ID分组得到),可以用索引匹配实现合并:
var combinedList = new List<QuestionWithAnswerCountVM>(); for (int i = 0; i < questions.Count; i++) { combinedList.Add(new QuestionWithAnswerCountVM { QuestionInfo = questions[i], AnswerCount = answers[i] }); }
注意:原有代码中
questions == null的判断无效,ToList()方法永远不会返回null,最多返回空集合,建议替换为判断!questions.Any()。
内容的提问来源于stack exchange,提问作者Nurlybek Bekmukhanbet
相关产品推荐
相关产品推荐

