2017-02-19 2 views
0

В моем приложении ASP.NET MVC, когда я собираюсь извлечь элемент, я обычно проверяю его существование с помощью Any(), после чего я выберу этот элемент на .Single(). Однако это приходит на ум, чтобы уменьшить количество запросов к базе данных, и я пытался использовать эту структуру:ASP.NET MVC: Является ли хорошей практикой проверять существование объекта Linq в базе данных с помощью обработки исключений?

item myItem = null; 

try 
{ 
    myItem = (from item in dbContext.items 
       where item.id == itemID 
       select item).Single(); 
} 
catch (Exception e) 
{ 

    // i understand item is not exist in db 
} 

// if item is available 
if (myItem ==null){ 
    //item was not in db 
}else{ 
    //item is present id db 
} 

Это только выборку базы данных один раз, и если элемент не существует, он будет бросать исключение, так что я не нужен чтобы проверить результаты Any(). Является ли это повышением эффективности моего приложения или это приведет к некоторому ухудшению из-за обработки исключений?

+2

Почему вы не используете 'SingleOrDefault()'. Тогда вам не понадобится обработка исключений для этой ситуации, и оставшаяся часть кода может остаться нетронутой. –

+0

, не забывая, что SingleOrDefault должен использоваться в возвращенных случаях с одной строкой. если dbContext.items удалил более одного результата, он выдал исключение. это будет использование FirstOrDefault, а FirstOrDefault работает быстрее, чем SingleOrDefault. –

+0

. Одним из важных соображений является также то, насколько дороги исключения для броска. Исключайте исключения, исключительные обстоятельства! – DavidG

ответ

1

Нет, это не так. Почему бы вам не использовать SingleOrDefault(). Тогда вам не понадобится обработка исключений для этой ситуации, и оставшаяся часть кода может остаться нетронутой.

0

Если вы думаете, что будет иметь значение, или возможно нуль, а затем использовать SingleOrDefault:

myItem = (from item in dbContext.items 
       where item.id == itemID 
       select item).SingleOrDefault(); 

Затем проверьте его:

// if item is available 
if (myItem ==null){ 
    //item was not in db 
}else{ 
    //item is present id db 
} 
0

Как уже упоминалось в других ответов, то лучше использовать. SingleOrDefault(), и если вы используете C# 6, вы можете использовать null conditional operator для упрощения выражения.

myItem = (from item in dbContext.items 
      where item.id == itemID 
      select item).SingleOrDefault(); 
var somePropertyValue = myItem?.SomeProperty; 

myItem? .SomeProperty будет возвращать значение свойства или нулевое значение, если myItem равно нулю.

Смежные вопросы