You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将MySQL表解析为List<T>?C# MySql.Data报错求助

问题原因

你遇到的InvalidCastException源于两个关键错误:

  1. reader.OfType<Words>()用法错误:MySqlDataReader返回的是DbDataRecord类型的行数据,无法通过OfType<Words>()自动转换为你的Words实体类,这个调用实际会返回空的IEnumerable<Words>。
  2. 即便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,它会自动完成行数据到实体类的映射:

  1. 通过NuGet安装Dapper包(或在NuGet包管理器中搜索安装)
  2. 修改代码如下:
using Dapper;

var sql = @"SELECT * FROM Words";
_records = (await DatabaseConnection.MySql_Connection.QueryAsync<Words>(sql)).ToList();

Dapper会自动根据实体类的属性名匹配数据库列名(支持大小写不敏感),大幅简化代码。

内容的提问来源于stack exchange,提问作者Francisco Lopez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 03:02:03