如果找到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;
答案 0 :(得分:3)
我认为你应该可以像这样使用新的Null条件操作符:
Guid? stuId= context.Students.FirstOrDefault(x => x.Name == student.Name)?.Id;
您可以在MSDN上的C#6中阅读有关此新语法的信息。基本上除了附加问号之外,它还会在执行右侧之前检查之前的语句是否为空。如果是,它将返回一个空值,因此你需要让你的Guid可以为空。
答案 1 :(得分:2)
是的,使用null-propagation/conditional operator(C#6中的新内容):
Guid? stuId = context.Students.FirstOrDefault(x => x.Name == student.Name)?.Id;
现在你有一个可空的,并且很容易检查是否有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();
答案 2 :(得分:0)
你可以这样做:
Guid? stuId = context.Students.FirstOrDefault(x => x.Name == student.Name)?.Id;
if ( stuId.HasValue )
{
// do something if we have a value
}
使用null条件运算符,但在尝试使用值之前,您仍需要检查是否确实获得了值
答案 3 :(得分:0)
如果您希望解决方案在较低版本的C#中工作而不是6(不使用空条件运算符),则可以像这样使用强制转换运算符:
var stuId = context.Students.Where(x => x.Name == student.Name).Select(i => (Guid?)i.Id).FirstOrDefault();
如果没有找到记录,这将正确返回null
,因为null
是可空struct
的默认值。