我在迭代大数据表(300k 行)时遇到问题。不幸的是,这个问题不能按需重现,所以我不知道如何解决它。在正确的条件下,应该演示该问题的最少代码:
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];
}