处理未找到结果

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 是可空 structs 的默认值。