我想在下面的投影中返回类别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
});
答案 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
}