处理没有找到结果

时间:2016-10-13 10:26:02

标签: c# .net linq .net-4.5

如果找到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;

4 个答案:

答案 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的默认值。