Как избежать перехода в блок кеша в c # и возврата к повторению цикла? - PullRequest
0 голосов
/ 13 декабря 2018

Вот мой код

     public List<Union100> Get(String IdType)
     {
        try
        {
            for (var i = 0; i <= 3; i++)
            {
                var typeIdOfObjectType = db.Objects.Where(x => x.ObjectsName == 
                        ObjectTypeName).Select(x => x.ObjectTgId).First();
                var d = GetParent();
            }
        }
        catch (exception e)
        {
        }
     }

предположим, что я получаю нулевое значение в переменной typeIdOfObjectType на 1-й итерации, поэтому он должен вернуться к циклу for вместо перехода к блоку кэша, он должен продолжить с итерацией i = 2 чтоя могу сделать для этого?

Ответы [ 3 ]

0 голосов
/ 13 декабря 2018

Прежде всего, вы можете использовать FirstOrDefault(); вместо First();

Затем вы можете использовать try/catch внутри блока.При этом ваш цикл не остановится, если у вас возникнет исключение.

Пример:

 public List<Union100> Get(String IdType)
 {
     for (var i = 0;i <= 3; i++)
     {
         try
         {
             var typeIdOfObjectType = db.Objects.Where(x => x.ObjectsName == ObjectTypeName).Select(x => x.ObjectTgId).FirstOrDefault();
             var d = GetParent();
         }
         catch{}
     }
 }
0 голосов
/ 13 декабря 2018

В строке, где вы выполняете запрос, есть несколько вызовов, некоторые из которых зависят от вызовов до того, как они что-то вернут.Если какой-либо из них вернет null, то будет сгенерировано исключение.

Использование синтаксиса нулевого распространения поможет вам избежать этого:

for (var i = 0;i <= 3; i++)
{
    var typeIdOfObjectType = 
                    db? // If db is null, then typeIdOfObjectType will be null
                      .Objects? // The same if .Objects is null
                      .Where(x => x.ObjectsName == ObjectTypeName)
                      .Select(x => x.ObjectTgId)
                      .First();

    if(typeIdOfObjectType == null)
    {
        continue; // Jump to the next iteration
    }

    // (Anything below here will be skipped for any iteration
    // where typeIdOfObjectType was null) 
}

Это проверит значение db и db.Objects перед вызовом Where(..) и остальными, и если какой-либо из них будет NULL, тогда это будет установлено как значение вашей переменной, и вы можете избежать некоторых исключений.

Еще один источник нуль-исх.исключения могут быть, если в предложении Where(..) ничего не найдено;если это так, вызов .First() вызовет исключение.Поэтому вам следует заменить его на FirstOrDefault(), который вместо этого вернет null.

Наконец, я бы добавил проверку, чтобы проверить, является ли typeIdOfObjectType значением null, и, если это так, вызовет continue, который пропускает любую логику, оставшуюся в цикле, и вместо этого переходит на итерацию гнезда.,

0 голосов
/ 13 декабря 2018

Замените «First ()» на FirstOrDefault (), и код вернет NULL и не сгенерирует исключение.

Здесь:

var `typeIdOfObjectType` = 
        db.Objects
            .Where(x => x.ObjectsName == ObjectTypeName)
            .Select(x => x.ObjectTgId)
            .FirstOrDefault();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...