对于多个对象的Enumerable.Single方法的替代方案?

时间:2017-01-19 19:51:06

标签: c# asp.net-mvc list

编辑:正如保罗所说,我只接受参数中每个值的一个可能值。因此,通过该逻辑,他们应该切换到列表。这导致了一个空的引用异常,虽然我仍然试图解决这个问题。

我正在尝试创建一个包含类别,问题和答案的调查构建器。目前,当我尝试更新类别,问题和答案的数据时,它只更新每个的第一个实例。我相信问题是因为我使用.Single方法。是否有用于列表的替代方法?

以下是仅更新第一个实例的两个示例。

public ActionResult Save(Survey survey, List<Category> category, List<Question> question, List<Answer> answer)
{
     //var categoryInDb = _context.Categories.Single(m => m.CategoryId == category.CategoryId);
          //categoryInDb.CategoryDescription = category.CategoryDescription;

  //Updated loop.
      foreach (var categorytoAdd in category)
            {
                foreach (var categoryInDb in _context.Categories.Where(m => m.CategoryId == categorytoAdd.CategoryId))
                    categoryInDb.CategoryDescription = categorytoAdd.CategoryDescription;
            }

     var questionInDb = _context.Questions.Single(m => m.QuestionId == question.QuestionId);
          questionInDb.QuestionText = question.QuestionText;

     _context.SaveChanges();
     return RedirectToAction("Index", "Surveys");
}

在视图模型中,它们被定义为

    public List<Category> Categories { get; set; }
    public List<Question> Questions { get; set; }

1 个答案:

答案 0 :(得分:1)

您怀疑Single只返回满足您条件的单个项目。如果您想要多个项目,请使用Where(当然会返回IEnumerable)。因为它现在是一个集合,你必须foreach来改变/访问/使用项目。

这样:

foreach (var categoryInDb in _context.Categories.Where(m => m.CategoryId == category.CategoryId))
   categoryInDb.CategoryDescription = category.CategoryDescription;

正如一个沉没注意到的那样,如果你有一个以上的记录,那么你Single实际上会抛出;所以在你修改整个查询以返回多个结果之前,这不会做任何事情。