如何将MySQL表解析为List<T>?C# MySql.Data报错求助
问题原因
你遇到的InvalidCastException源于两个关键错误:
reader.OfType<Words>()用法错误:MySqlDataReader返回的是DbDataRecord类型的行数据,无法通过OfType<Words>()自动转换为你的Words实体类,这个调用实际会返回空的IEnumerable<Words>。- 即便
OfType<T>返回有效序列,也不能直接强制转换为List<Words>——IEnumerable<T>是延迟执行的序列,必须调用.ToList()方法生成实际的List集合。
解决方案
提供两种可行的解决方式:
方式一:手动映射行数据到实体类
逐行读取DataReader中的字段,手动创建Words实例并添加到List中:
var command = DatabaseConnection.MySql_Connection.CreateCommand(); command.CommandText = @"SELECT * FROM Words"; var reader = await command.ExecuteReaderAsync(); var records = new List<Words>(); while (await reader.ReadAsync()) { var word = new Words { // 根据你的Words类属性和数据库列名调整,示例假设属性与列名一致 Id = reader.GetInt32(reader.GetOrdinal("Id")), WordContent = reader.GetString(reader.GetOrdinal("WordContent")), // 其他属性依次读取,注意匹配数据类型(比如用GetDateTime处理日期字段) }; records.Add(word); } _records = records;
这种方式适合需要精确控制字段映射逻辑的场景,注意要根据字段的实际数据类型选择对应的GetXXX方法(比如GetNullableInt32处理可空字段)。
方式二:使用ORM框架简化映射(推荐)
如果不想手动编写映射代码,可以使用轻量ORM框架如Dapper,它会自动完成行数据到实体类的映射:
- 通过NuGet安装Dapper包(或在NuGet包管理器中搜索安装)
- 修改代码如下:
using Dapper; var sql = @"SELECT * FROM Words"; _records = (await DatabaseConnection.MySql_Connection.QueryAsync<Words>(sql)).ToList();
Dapper会自动根据实体类的属性名匹配数据库列名(支持大小写不敏感),大幅简化代码。
内容的提问来源于stack exchange,提问作者Francisco Lopez
相关产品推荐
相关产品推荐

