我想在下面的投影中返回类别名称或只是 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
});
您需要检查是否存在具有该 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
}