我有一个问题表和一个答案表
我总是需要显示问题列表,无论是否有相应的答案,我需要获取答案(响应)
我使用以下代码
var Questions = db.Questions.Where(x => x.isActive);
var Answers = db.Answers.Where(x => x.AssessmentID == 99);
AssessmentResponseVM model = new AssessmentResponseVM();
foreach (var question in Questions)
{
AnswerAndQuestions q = new AnswerAndQuestions { };
q.QuestionText = question.QuestionText;
q.QuestionID = question.ID;
q.Response = Answers.Where(a => a.QuestionID == question.ID).SingleOrDefault().Response; <--- throws exception if there is no answer for the question
model.Questions.Add(q);
}
但是得到这个错误
Object reference not set to an instance of an object.
在这一行
q.Response = Answers.Where(a => a.QuestionID == question.ID).SingleOrDefault().Response;
change
q.Response = Answers.Where(a => a.QuestionID == question.ID).SingleOrDefault().Response;
到此代码
q.Response=Answers.Any(a=>a.QuestionID==question.ID)?Answers.firstOrDefault(a => a.QuestionID == question.ID).Response:new Response();
q.Response = Answers.Any(a => a.QuestionID == question.ID) ? Answers.Where(a => a.QuestionID == question.ID).FirstOrDefault().Response;
如果你被允许使用c# 6.0,我建议你尝试新的空条件运算符。
q.Response = Answers.Where(a => a.QuestionID == question.ID).SingleOrDefault()?.Response;
当Answers.Where(a => a.QuestionID == question.ID).SingleOrDefault()
返回默认值为null时,返回null
。
如果你需要其他东西,而不是null
,你可以使用空合并运算符。
q.Response = Answers.Where(a => a.QuestionID == question.ID).SingleOrDefault()?.Response ?? response, what you need;