空传播

时间:2018-09-06 14:18:27

标签: c# .net linq

当不满足linq查询条件时,我希望从questions.FirstOrDefault()返回空值-而是一个异常

  

序列中没有匹配的元素

被抛出。有什么想法吗?

var firstQ = questions.FirstOrDefault(a =>
      a.Answers.Single(x => x.CourseAssignmentId == 
     courseAssignmentId)?.Score == null) ?? questions.FirstOrDefault();

3 个答案:

答案 0 :(得分:0)

这就是SingleSingleOrDefault之间的区别。

如果与您的谓词相匹配的 1 项之外,

Single就会引发异常。

答案 1 :(得分:0)

您应该改用FirstOrDefault()。顺便说一句,您可以结合条件大概

a.Answers.Single(x => x.CourseAssignmentId == courseAssignmentId && x.Score == null)

答案 2 :(得分:0)

正如其他人已经提到的,这是Enumerable.Single的预期行为。

无论如何,它看起来像一个XY problem。也许您应该将最后得分的问题存储在某个地方(例如字典)。

也就是说,您可以按以下方式重构代码:

var assignmentScoredQuestionMap = new Dictionary<int, Question>();
// Fill the whole dictionary:
// You need to add for which assignment identifier you've answered a question

int assignmentId = 384;

// If the whole assignment exists, you set lastScoredQuestion, otherwise
// you set it to first question.
if(!assignmentScoredQuestionMap.TryGetValue(assignmentId, out var lastScoredQuestion)) 
   lastScoredQuestion = questions.FirstOrDefault();