LINQ -连接两个表并从连接的右侧获取值(如果存在)会抛出异常



我有一个问题表和一个答案表

我总是需要显示问题列表,无论是否有相应的答案,我需要获取答案(响应)

我使用以下代码

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;

最新更新