Список <> элементов, потерянных во время ToArray ()? - PullRequest
2 голосов
/ 14 июня 2011

Некоторое время назад я закодировал систему сбора информации об остановках общественного транспорта. Информация о любом инциденте собирается в базе данных MSSQL. Потребители получают доступ к этим данным, вызывая веб-службу .asmx. Данные собираются из БД с использованием ADO.NET, каждая строка данных затем заполняет объект отклонения и добавляется в список. На уровне сервиса к списку применяется вызов ToArray () и он возвращается потребителю.

Пока все хорошо. Но проблема в том, что в некоторых случаях (5% или около того) мы знали, что массив каким-то образом сокращается. Вместо обычного количества 15-20 предметов, возвращается только половина или даже меньше. Остальные элементы всегда находятся в конце исходного списка. И, еще реже, пара элементов повторяется / перетасовывается в начале массива.

После некоторого тестирования на разных уровнях кажется, что свертывание происходит в конце процесса, то есть во время приведения к массиву или сериализации SOAP. Но код кажется таким невинным, да ??:

[WebMethod]
public Deviation[] GetDeviationsByTimeInterval(DateTime from, DateTime to)
{
    return DeviRoutines.GetDeviationsByTimeInterval(from, to).ToArray();
}

Я не уверен на 100%, что ошибка не возникает на уровне SQL или на уровне доступа к данным, но они доказали свою работу во время тестирования. Любая помощь по этому вопросу будет очень полезна! :)

Ответы [ 3 ]

0 голосов
/ 14 июня 2011

http://msdn.microsoft.com/en-us/library/x303t819.aspx

Тип: T [] Массив, содержащий копии элементов списка.

Вы не нашли ошибку в .NET, скорее всего, это что-то в вашем GetDeviationsByTimeInterval

0 голосов
/ 14 июня 2011

Я был бы готов поспорить, что ToArray делает именно то, что ему говорят, но либо ваши from, либо to значения иногда являются ненужными (ошибка проверки?), Либо GetDeviationsByTimeInterval по какой-то причине неправильно их интерпретирует.

Вставьте несколько входов в Deviation[] и GetDeviationsByTimeInterval, чтобы увидеть, какие значения передаются ему, и в следующий раз, когда он станет грушевидным, вы сможете диагностировать, где проблема.

0 голосов
/ 14 июня 2011

Я бы сделал что-то вроде:

public Deviation[] GetDeviationsByTimeInterval(DateTime from, DateTime to)
{
    var v1 = DeviRoutines.GetDeviationsByTimeInterval(from, to);
    LogMe( "v1: " + v1.Count );

    var v2 = v1.ToArray();
    LogMe( "v2: " + v2.Length );

    return v2;
}

Проверка того, что вы ожидаете, обычно окупается: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...