新闻中心

.NET怎么将DataTable转换为List对象_DataTable转List方法教程

2025-11-20
浏览次数:
返回列表
答案:在.NET开发中,DataTable可转换为List以便进行LINQ操作,常用方法包括反射自动映射和手动映射。反射法通用性强,支持属性名与列名一致的自动匹配及可空类型处理;手动法性能更高,适用于字段多或高频率场景,但需为每个实体编写专用代码。还可将反射逻辑封装为DataTable的扩展方法,提升代码复用性和可维护性。根据性能和灵活性需求选择合适方式即可。

.net怎么将datatable转换为list对象_datatable转list方法教程

在 .NET 开发中,经常需要将 DataTable 转换为 List 对象,以便更方便地进行 LINQ 操作或传递给业务逻辑层。虽然 DataTable 是基于行和列的结构,而 List 是强类型的集合,但通过反射或手动映射可以实现高效转换。

使用反射自动映射 DataTable 到 List

这是最通用的方法,适用于大多数实体类。只需要确保实体类的属性名与 DataTable 的列名一致。

示例代码:

public static List<T> DataTableToList<T>(DataTable dt) where T : new()
{
    var list = new List<T>();

    foreach (DataRow row in dt.Rows)
    {
        var entity = new T();
        var type = typeof(T);
        var properties = type.GetProperties();

        foreach (var property in properties)
        {
            if (dt.Columns.Contains(property.Name) && !row.IsNull(property.Name))
            {
                var value = row[property.Name];
                // 处理可空类型
                var propType = property.PropertyType;
                if (propType.IsGenericType && propType.GetGenericTypeDefinition() == typeof(Nullable<>))
                {
                    propType = Nullable.GetUnderlyingType(propType);
                }
                var convertedValue = Convert.ChangeType(value, propType);
                property.SetValue(entity, convertedValue, null);
            }
        }
        list.Add(entity);
    }

    return list;
}

说明: 该方法利用反射遍历 DataTable 的每一行和每个属性,自动匹配列名与属性名,并进行类型转换。支持可空类型(如 int?、DateTime?)。

手动映射(适用于性能要求高的场景)

如果对性能有较高要求,或者字段较多,手动映射效率更高,避免反射开销。

示例:

假设有一个实体类:

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime? BirthDate { get; set; }
}

转换方法:

小云雀 小云雀

剪映出品的AI视频和图片创作助手

小云雀 1949 查看详情 小云雀
public static List<User> DataTableToUserList(DataTable dt)
{
    var list = new List<User>();
    foreach (DataRow row in dt.Rows)
    {
        var user = new User
        {
            Id = row["Id"] != DBNull.Value ? Convert.ToInt32(row["Id"]) : 0,
            Name = row["Name"]?.ToString(),
            BirthDate = row["BirthDate"] != DBNull.Value ? (DateTime?)Convert.ToDateTime(row["BirthDate"]) : null
        };
        list.Add(user);
    }
    return list;
}

优点: 执行速度快,控制更精细;缺点: 需要为每个实体写专用方法。

使用扩展方法提升代码复用性

可以把通用的转换逻辑封装成扩展方法,让 DataTable 直接调用。

例如:

public static class DataTableExtensions
{
    public static List<T> ToList<T>(this DataTable dt) where T : new()
    {
        // 此处放入上面的反射逻辑
        ...
    }
}

使用时只需:
var users = dataTable.ToList<user>();</user>
代码更简洁,易于维护。

基本上就这些常用方法。根据项目需求选择反射自动映射或手动映射即可。

以上就是.NET怎么将DataTable转换为List对象_DataTable转List方法教程的详细内容,更多请关注其它相关文章!


# 遍历  # 餐馆网站推广  # 开封省心的网站建设  # 5号网关键词排名  # 宁都租房网站建设  # 北京建设工程律师网站  # 惠州与网站建设  # 怎样推广定制品市场营销  # 市辖区网站建设优化  # seo引流营销推广  # 通海县网站seo  # 较高  # 只需  # list  # 这是  # 实体类  # 有什么区别  # 更高  # 复用  # 适用于  # 转换为  # .net  # typedef  # 代码复用  # ai 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: msn官网入口地址手机版 msn官方网站手机最新链接  铁路12306改签能改到更早的车次吗_铁路12306改签提前车次规则  MAC怎么安装Homebrew包管理器_MAC为开发者和高级用户安装命令行工具  为什么简单的XML文件也会解析失败? 检查隐藏的非打印字符(如BOM)的方法  LocoySpider如何部署到云服务器_LocoySpider云部署的远程配置  一加 14R 快充无反应_一加 14R 充电优化  必由学在线入口 必由学网页版快速登录入口  为什么我的微信朋友圈看不到别人的更新_微信朋友圈更新显示异常解决方法  在J*aScript中复现SciPy的B样条拟合与求值:关键考量  Python类型检查:优化关联可选属性的Mypy推断策略  J*a里如何使用forEach遍历Map_Map遍历方法说明  Go语言中Map值调用指针接收器方法的限制与应对  马斯克:Optimus 人形机器人复数形式为 Optimi  《刺客信条:影》PS5 Pro和Switch 2画面对比  AO3访问入口汇总 AO3网页版同人作品一键直达  Windows7怎么硬盘安装 Windows7提取ISO镜像到非系统盘并运行setup.exe实现硬盘直装【教程】  学习通在线学习平台 学习通网页版直接进入课程中心  支付宝碰一碰设备是REDMI手机吗 博主拆机辟谣:处理器、内存都不一样  CSS条件样式无法按设备触发怎么排查_media条件语句正确设置解决触发问题  Composer如何解决json扩展缺失的错误  win11 arm版怎么安装 M1/M2 Mac虚拟机安装ARM win11的方法  怎样使用“本地安全策略”提升Windows安全性_Secpol.msc配置指南【高手】  顺丰快递查单号物流信息 顺丰快递小程序查询入口  抖音小游戏合成大西瓜免费秒玩入口链接 抖音小游戏热门合集秒玩网站  DLsite中文平台入口 DLsite官网内容在线查看  必由学官方登录入口 必由学教师学生账号快速访问  C++如何实现一个装饰器模式_C++设计模式之动态地给对象添加额外职责  qq浏览器打开空白页怎么办 qq浏览器启动后显示白屏的解决教程  如何更改在 Excel 中打开超链接时的默认浏览器  qq游戏大厅官方下载_qq游戏免费下载安装入口  Go语言中JSON数据解码与字段访问指南  CSS实现侧边栏导航项全宽圆角悬停背景效果  天眼查企业查询官网入口 天眼查官方网页版查询  蛙漫正版漫画平台入口_蛙漫免费阅读全站漫画资源  优化LangChain文档加载与ChromaDB集成:解决多文档处理与分块问题  poki免费入口快捷访问 poki人气小游戏直接玩站点  CKEditor 5 自定义构建在React应用中渲染失败的调试与解决  漫蛙2漫画入口 漫蛙正版网页漫画直达网址  解决J*aScript中重复选择项的确认对话框显示问题  电脑屏幕颜色不舒服怎么办_Windows夜间模式与色彩校准教程【护眼技巧】  Lar*el Form Request中唯一性验证在更新操作中的正确实现  Win11蓝牙耳机断连怎么解决 Win11蓝牙设置重新配对与驱动更新【技巧】  如何提高微信支付的安全性_微信支付安全防护与设置建议  JUnit5/Mockito:优雅测试内部依赖与异常处理的实践  Django模型中自动计算可用余额的实现方法  C++20的source_location是什么_C++在编译期获取源码位置信息用于日志和断言  Python实时数据流中的动态最值查找策略  如何将一个大型PHP应用拆分为多个Composer包_微服务与模块化架构的Composer实践  J*a实现学校排课程序_面向对象结构化项目示例  微博网页版首页入口 微博电脑端官网登录链接 

搜索