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

时间:2014-04-07 12:41:36

标签: c# linq

我想在下面的投影中返回类别Name或者只返回null,但是我得到一个空引用异常,如果result.CategoryId为null则这是有意义的。

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
});

4 个答案:

答案 0 :(得分:1)

您需要检查是否存在具有该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
}

答案 1 :(得分:1)

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

Category = categories
           .FirstOrDefault(c=> c.Id.Equals(i.result.CategoryId)) != null ? 
           categories
           .FirstOrDefault(c=> c.Id.Equals(i.result.CategoryId)).Name : null;

答案 2 :(得分:0)

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
                        };
                });

答案 3 :(得分:-1)

categories.Where(c=>c.Id.Equals(i.result.CategoryId)).SingleOrDefault()
如果未找到任何内容,则

返回null。如果您然后尝试访问“.Name”,它将抛出一个类似于您的例外。

尝试这样做:

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