2016-10-13 6 views
0

Исключено следующее исключение линии, если найдено 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; 

ответ

2

Да, с null-propagation/conditional operator (новый в C# 6):

Guid? stuId = context.Students.FirstOrDefault(x => x.Name == student.Name)?.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(); 
+0

Я использую dot net 4.5 означает C# 5, поэтому ваше решение не будет работать для меня. – simbada

+1

@simbada: добавлен альтернативный подход, если вы не можете использовать C# 6 –

+0

Я проверяю это. Ваше 1-е альтернативное решение возвращает пустой GUID, который, вероятно, не подходит для меня. Все, что я хочу, должно вернуть значение null до тех пор, пока я не смогу его достичь. Я согласен с вашим первым альтернативным золем. – simbada

3

I подумайте, что вы сможете использовать новый Null Conditional Operater следующим образом:

Guid? stuId= context.Students.FirstOrDefault(x => x.Name == student.Name)?.Id; 

Вы можете прочитать об этом новом синтаксисе в C# 6 по адресу MSDN. В принципе, помимо дополнительного вопросительного знака, он будет проверять, что перед тем, как исполнять правую сторону, перед выполнением инструкции не будет нуля. Если это так, он вернет нулевое значение, поэтому вам нужно будет свести значение Guid.

+4

Переменный тип должен быть «Guid?». – kiziu

+0

Позвольте мне попробовать. кажется, хороший способ, если он работает. – simbada

+1

Это должно быть 'Guid?', Вместо простого 'Guid'. –

0

Вы можете сделать это следующим образом:

Guid? stuId = context.Students.FirstOrDefault(x => x.Name == student.Name)?.Id; 
if (stuId.HasValue) 
{ 
    // do something if we have a value 
} 

который использует условный оператор нуль, но вам все равно нужно проверить, действительно ли вы получили значение, прежде чем пытаться использовать значение

0

Если вы муравей решение работает в нижней версии C#, чем 6 (не используя нуль-условный оператор), вы можете использовать оператор приведения, как это:

var stuId = context.Students.Where(x => x.Name == student.Name).Select(i => (Guid?)i.Id).FirstOrDefault(); 

Это будет корректно возвращать null если запись не найдена, а null является значение по умолчанию для nullable struct s.

+0

Вы должны сделать свое объявление 'Guid?' Слева вместо 'var'. Это неочевидно, если вы не понимаете все выражения справа. – Ian

+0

Действительно, но я всегда использую 'var', если я не хочу, чтобы переменная имела более базовый тип, такой как интерфейс, который он реализует. Вы всегда можете использовать IDE и просто наведите указатель мыши на переменную, чтобы увидеть тип. – kiziu