C # DataTable AsEnumerable, выбрасывающий KeyNotFoundException: это пропущенная строка или столбец или что-то еще? - PullRequest
0 голосов
/ 26 августа 2018

У меня проблема с итерацией по большой таблице данных (300 тыс. Строк).К сожалению, проблема не воспроизводима по требованию, поэтому я не знаю, как ее решить.Минимальный код, который должен демонстрировать проблему, при правильных условиях:

var data = dataTable.AsEnumerable().Select(r => r.Field<string>("name")).ToArray();

Я вижу сообщение об ошибке:

System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
at System.ThrowHelper.ThrowKeyNotFoundException()
at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
at ___.<>c__DisplayClass10_0.<__>b__0(DataRow r) in __Database.cs:line XX
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)

Я подозреваю, что существует проблема с целостностью строки, так какЯ вижу (DataRow r) в сообщении об ошибке.Но как перечисление в DataTable может пытаться ссылаться на строку, которой нет?Я подозреваю, что это не проблема столбца, так как я не вижу сообщение об ошибке столбца, например

Column 'name' does not belong to table .
+ System.Data.DataRow.GetDataColumn(string)
+ System.Data.DataRow.get_Item(string)
+ System.Data.DataRowExtensions.Field<T>(System.Data.DataRow, string)
+ System.Linq.Enumerable.WhereSelectEnumerableIterator<TSource, TResult>.MoveNext()
+ Buffer<TElement>..ctor(IEnumerable<TElement>)
+ System.Linq.Enumerable.ToArray<TSource>(IEnumerable<TSource>)

РЕДАКТИРОВАТЬ: DataTable создается с этим запросом MySQL:

using (MySqlDataAdapter dataAdapter = new MySqlDataAdapter(commandText, connectionString))
{
    dataAdapter.SelectCommand.CommandType = commandType;
    // Use DataSet to avoid bug in MySqlDataAdapter with filling tables directly
    DataSet dataSet = new DataSet();
    dataAdapter.Fill(dataSet);
    var dataTable = dataSet.Tables[0];
}
...