Прерывистая ошибка Linq FirstOrDefault - индекс находился за пределами массива

Примерно раз в месяц мы сталкиваемся с причудливой ошибкой, которую я не могу объяснить. Ошибка заключается в следующем:

System.IndexOutOfRangeException: Index was outside the bounds of the array.
at System.Collections.Generic.List`1.Enumerator.MoveNext() at 
System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source, Func`2   predicate)

Вот код, где происходит ошибка. Этот метод вызывается в конструкторе MyObject:

// pull a list of MyObjects from the cache so we can see if this one exists
List<MyObject> MyObjectList= System.Web.HttpRuntime.Cache["MyObjects"] as   List<MyObject>;
if (MyObjectList!= null)
{
     // this is where the error happens.  Just getting an object out based on its id
     MyObject obj = MyObjectList.FirstOrDefault(m => m.Id == this.Id);

     if(obj != null){
         // great, it already exists in the cache
     }
     else{
         // doesn't exist in the cache, query the database and then add it to the cache
          //add it to the cache after loading from db
          MyObjectList.Add(this);
          System.Web.HttpContext.Current.Cache.Insert("MyObjects",MyObjectList);
     }
}
else{
    // instantiate a new list, query the db for this object, add it to the list and add the list to the cache
    MyObjectList= new List<MyObject>();

    //add it to the cache after it was loaded from the db
    MyObjectList.Add(this);
    System.Web.HttpContext.Current.Cache.Insert("MyObjects",MyObjectList);
}

Когда происходит ошибка, это происходит в 100% случаев, когда этот метод выполняется (а это много), пока я не перезапущу пул приложений, который исправляет его. Это наводит меня на мысль, что это как-то связано с кеширующей частью, но для меня это все равно не имеет смысла, так как, когда я вытаскиваю MyObjectList из кеша, его уже нельзя изменить, но это кажется единственным способом ошибка может произойти, если MyObjectList каким-то образом изменяется, когда происходит firstordefault.

Ошибка настолько редка и непредсказуема, что мы не смогли ее воссоздать, поэтому любая помощь будет принята с благодарностью.

1 ответ

if (MyObjectList!= null) может быть, попробовать такif (MyObjectList!= null && MyObjectList.Any(m => m.Id == this.Id)

а также FirstOrDefault будет просто First может быть, иногда у вас есть пустой список, и у вас есть запасной вариант для этого на else блок

Другие вопросы по тегам