返回值或 null,没有 null 引用异常 linq

本文关键字:null 异常 linq 引用 返回值 没有 | 更新日期: 2023-09-27 17:57:11

我想在下面的投影中返回类别名称或只是 null,但我得到一个 null 引用异常,如果结果是有意义的。类别 ID 为空。

return results.Select(i =>
new Model
{
  Score = i.Score
 ,Date = i.InstanceResult.TestDate
 ,Category = categories.Where(c=>c.Id.Equals(i.result.CategoryId)).SingleOrDefault().Name
});

返回值或 null,没有 null 引用异常 linq

您需要检查是否存在具有该 ID 的类别,然后决定要分配的值。

return results.Select(i =>
new Model
{
     Score = i.Score
     ,Date = i.InstanceResult.TestDate
     ,Category = categories.Any(c => c.Id.Equals(i.result.CategoryId)) ?
                 categories.First(c => c.Id.Equals(i.result.CategoryId)).Name : 
                 null
});

您可以使用这样的扩展方法对其进行整理

...
Category = categories.GetNameFromId(i.result.CategoryId)
...
public static string GetNameFromId(this IEnumerable<Category> categories, string id)
{
    return categories.Any(c => c.Id.Equals(id)) ?
                 categories.First(c => c.Id.Equals(id)).Name : 
                 null
}

您可以使用这样的FirstOrDefault,但如果要在一个语句中执行此操作,则需要执行相同的查询两次:

Category = categories
           .FirstOrDefault(c=> c.Id.Equals(i.result.CategoryId)) != null ? 
           categories
           .FirstOrDefault(c=> c.Id.Equals(i.result.CategoryId)).Name : null;
return results.Select(i =>
                {
                    var singleOrDefault = categories.SingleOrDefault(c => c.Id.Equals(i.result.CategoryId));
                    return new Model
                        {
                            Score = i.Score,
                            Date = i.InstanceResult.TestDate,
                            Category = singleOrDefault != null ? singleOrDefault.Name : null
                        };
                });
categories.Where(c=>c.Id.Equals(i.result.CategoryId)).SingleOrDefault()

如果未找到任何内容,则返回 null。如果您随后尝试访问" .名称"它会像你得到的那样抛出一个异常。

尝试这样做:

Category singleCategory = categories.Where(c=>c.Id == i.result.CategoryId).SingleOrDefault();
if (singleCategory != null)
{
    // Do something with the Properties
}