如果未找到匹配项,则FirstOrDefault返回NullReferenceException

时间:2014-01-16 12:00:19

标签: c# lambda

这是我的代码

string displayName = Dictionary.FirstOrDefault(x =>x.Value.ID== long.Parse(options.ID)).Value.DisplayName;

如果x.Value.ID与options.ID匹配,则代码可以正常工作。但是如果没有,我会得到一个nullreferenceexception。

8 个答案:

答案 0 :(得分:61)

如果没有项与谓词匹配,

FirstOrDefault将返回类型的默认值。适用于null的参考类型。这就是例外的原因。

所以你必须先检查null

string displayName = null;
var keyValue = Dictionary
    .FirstOrDefault(x => x.Value.ID == long.Parse(options.ID));
if(keyValue  != null)
{
    displayName = keyValue.Value.DisplayName;
} 

但是如果要搜索值,字典的关键是什么? Dictionary<tKey,TValue>用于通过键查找值。也许你应该重构它。

另一个选择是提供DefaultIfEmpty的默认值:

string displayName = Dictionary
    .Where(kv => kv.Value.ID == long.Parse(options.ID))
    .Select(kv => kv.Value.DisplayName)   // not a problem even if no item matches
    .DefaultIfEmpty("--Option unknown--") // or no argument -> null
    .First();                             // cannot cause an exception

答案 1 :(得分:10)

您可以使用其他LINQ方法的组合来处理不匹配的条件:

var res = dictionary.Where(x => x.Value.ID == someID)
                    .Select(x => x.Value.DisplayName)
                    .DefaultIfEmpty("Unknown")
                    .First();

答案 2 :(得分:2)

这是因为FirstOrDefault可以返回null,导致您的后续.Value导致异常。您需要将其更改为:

var myThing = things.FirstOrDefault(t => t.Id == idToFind);

if(myThing == null)
    return; // we failed to find what we wanted
var displayName = myThing.DisplayName;

答案 3 :(得分:1)

简单地使用问号技巧进行空检查:

string displayName = Dictionary.FirstOrDefault(x => x.Value.ID == long.Parse(options.ID))?.Value.DisplayName ?? "DEFINE A DEFAULT DISPLAY NAME HERE";

答案 4 :(得分:0)

我假设你正在使用可以为空的数据类型,你可以这样做:

var t = things.Where(x => x!=null && x.Value.ID == long.Parse(options.ID)).FirstOrDefault();
var res = t == null ? "" : t.Value;

答案 5 :(得分:0)

要添加到解决方案,这里有一个可能有帮助的LINQ语句

Utilities.DIMENSION_MemTbl.Where(a => a.DIMENSION_ID == format.ContentBrief.DimensionID).Select(a=>a.DIMENSION1).DefaultIfEmpty("").FirstOrDefault();

如果查询结果为null,则结果为空字符串。

答案 6 :(得分:0)

这个答案适用于我们这些需要视觉写作的人(像我一样:)

在下面的代码截图中,会抛出一个 NullReferenceException,根本原因是 ReferenceIdentification_02 属性。

enter image description here

调试时,我们看到我查询的orderLine.REF数组不包含ReferenceIdentificationQualifier_01== "RU"的匹配对象,因此此时FirstOrDefault()返回值是 NULL

enter image description here

为了防止 NullReferenceException,我首先在 FirstOrDefault() 数组上执行 orderLine.REF。如果返回的值不是 null,则我检索该值。

enter image description here

答案 7 :(得分:-1)

您可以将“Where”语句与 FirstOrDefault() 一起使用。 像这样。

 var modelItem =  _dbcontext.ModelName.Where(n => n.NewsTagId == newsTag.Id).FirstOrDefault();

如果与查询不匹配,则返回第一项。 更好的做法是在查询后检查 NULL。

  if(modelItem == null)
  {
       return "Not Found."
  }
  else
  {
       // continue process
  }