Я пытаюсь разобраться в ситуации, в которой я использую Entity Framework на .net 3.5 sp1 + MySQL 6.1.2.0 в качестве провайдера. Он включает следующий код:
Response.Write("Products: " + plist.Count() + "<br />");
var total = 0;
foreach (var p in plist)
{
//... some actions
total++;
//... other actions
}
Response.Write("Total Products Checked: " + total + "<br />");
Как правило, общее количество продуктов меняется при каждом запуске, и оно не совпадает с полным итогом в plist. Он варьируется в широких пределах, от ~ 1/5 до половины.
В foreach нет никакого кода потока управления, т. Е. Без перерыва, продолжения, попытки / перехвата, условий, связанных с total ++, всего, что может повлиять на счет. В качестве подтверждения в цикле фиксируются другие итоги, относящиеся к действиям, которые соответствуют нижнему и более высокому суммарным прогонам.
Я не нахожу никаких причин для вышеперечисленного, кроме как в объектной структуре или провайдере mysql, который заставляет его завершать foreach при получении элемента.
Тело foreach может иметь некоторые отличия во времени, так как действия включают доступ к файлам и сети, Мой лучший способ на тот момент - когда код .net выходит за определенные пределы, возникает некоторый тип время ожидания в базовом фреймворке / провайдере, и вместо того, чтобы вызвать исключение, он молча сообщает, что больше нет элементов для перечисления .
Может ли кто-нибудь пролить свет на вышеприведенный сценарий и / или подтвердить, имеет ли провайдер Entity Framework / MySQL поставщик вышеуказанного поведения?
Обновление 1: Я не могу воспроизвести поведение с помощью Thread.Sleep в простом foreach в тестовом проекте, не уверен, где еще искать это странное поведение: (.
Обновление 2: в приведенном выше примере .Count () всегда возвращает одинаковое + правильное количество предметов. Использование ToList или ToArray, как предлагается, позволяет обойти проблему как положено (нет операторов управления потоком в теле foreach), и оба значения совпадают + не меняются при каждом запуске.
Что меня интересует, так это то, что вызывает такое поведение в каркасе сущностей + mysql. Действительно предпочел бы не менять код во всех проектах, в которых для создания .ToArray используется Entity Framework + MySQL перед перечислением результатов, потому что я не знаю, когда он проглотит некоторые результаты. Или, если я сделаю это, хотя бы узнайте, что / почему это произошло.