处理未找到结果
handling no result found
如果找到 no matching record
,则以下行抛出异常。
Guid stuId= context.Students.FirstOrDefault(x => x.Name == student.Name).Id;
我明白了,我可以处理上面的行
var stuId= context.Students.FirstOrDefault(x => x.Name == student.Name);
if (stuId){}else{}
但是,
我能否使同一行更智能地处理未找到序列的错误
Guid stuId= context.Students.FirstOrDefault(x => x.Name == student.Name).Id;
我认为您应该能够像这样使用新的 Null 条件运算符:
Guid? stuId= context.Students.FirstOrDefault(x => x.Name == student.Name)?.Id;
您可以在 MSDN 上阅读 C#6 中的这一新语法。基本上除了额外的问号,它会在执行右侧之前检查之前的语句是否为空。如果是,它将 return 一个空值,所以你需要让你的 Guid 可以为空。
是的,使用 null-propagation/conditional operator(C#6 中的新功能):
Guid? stuId = context.Students.FirstOrDefault(x => x.Name == student.Name)?.Id;
现在你有了一个可以为 null 的对象,很容易检查是否有 id:
if(stuId.HasValue)
{
// ...
}
如果您不能按照评论使用 C#6:
Guid stuId = context.Students
.Where(x => x.Name == student.Name)
.Select(x=> x.Id)
.DefaultIfEmpty(Guid.Empty)
.First();
现在您可以检查 Guid.Empty
:
if(stuId != Guid.Empty)
{
}
如果 Guid.Empty
是有效值,您也可以在此处使用 Guid?
:
Guid? stuId = context.Students
.Where(x => x.Name == student.Name)
.Select(x=> (Guid?) x.Id)
.DefaultIfEmpty(null)
.First();
你可以这样做:
Guid? stuId = context.Students.FirstOrDefault(x => x.Name == student.Name)?.Id;
if ( stuId.HasValue )
{
// do something if we have a value
}
它使用了 null 条件运算符,但您仍然需要在尝试使用该值之前检查您是否确实获得了一个值
如果您想要一个在低于 6 的 C# 版本中工作的解决方案(不使用 null 条件运算符),您可以像这样使用强制转换运算符:
var stuId = context.Students.Where(x => x.Name == student.Name).Select(i => (Guid?)i.Id).FirstOrDefault();
如果没有找到记录,这将正确 return null
,因为 null
是可空 struct
s 的默认值。
如果找到 no matching record
,则以下行抛出异常。
Guid stuId= context.Students.FirstOrDefault(x => x.Name == student.Name).Id;
我明白了,我可以处理上面的行
var stuId= context.Students.FirstOrDefault(x => x.Name == student.Name);
if (stuId){}else{}
但是,
我能否使同一行更智能地处理未找到序列的错误
Guid stuId= context.Students.FirstOrDefault(x => x.Name == student.Name).Id;
我认为您应该能够像这样使用新的 Null 条件运算符:
Guid? stuId= context.Students.FirstOrDefault(x => x.Name == student.Name)?.Id;
您可以在 MSDN 上阅读 C#6 中的这一新语法。基本上除了额外的问号,它会在执行右侧之前检查之前的语句是否为空。如果是,它将 return 一个空值,所以你需要让你的 Guid 可以为空。
是的,使用 null-propagation/conditional operator(C#6 中的新功能):
Guid? stuId = context.Students.FirstOrDefault(x => x.Name == student.Name)?.Id;
现在你有了一个可以为 null 的对象,很容易检查是否有 id:
if(stuId.HasValue)
{
// ...
}
如果您不能按照评论使用 C#6:
Guid stuId = context.Students
.Where(x => x.Name == student.Name)
.Select(x=> x.Id)
.DefaultIfEmpty(Guid.Empty)
.First();
现在您可以检查 Guid.Empty
:
if(stuId != Guid.Empty)
{
}
如果 Guid.Empty
是有效值,您也可以在此处使用 Guid?
:
Guid? stuId = context.Students
.Where(x => x.Name == student.Name)
.Select(x=> (Guid?) x.Id)
.DefaultIfEmpty(null)
.First();
你可以这样做:
Guid? stuId = context.Students.FirstOrDefault(x => x.Name == student.Name)?.Id;
if ( stuId.HasValue )
{
// do something if we have a value
}
它使用了 null 条件运算符,但您仍然需要在尝试使用该值之前检查您是否确实获得了一个值
如果您想要一个在低于 6 的 C# 版本中工作的解决方案(不使用 null 条件运算符),您可以像这样使用强制转换运算符:
var stuId = context.Students.Where(x => x.Name == student.Name).Select(i => (Guid?)i.Id).FirstOrDefault();
如果没有找到记录,这将正确 return null
,因为 null
是可空 struct
s 的默认值。