首页 > 编程语言 >[CSharpTips]C# 将DataTable转换为类

[CSharpTips]C# 将DataTable转换为类

时间:2022-09-01 15:02:55浏览次数:58  
标签:using C# value ToString CSharpTips 为类 new dt DataTable

将DataTable转换为类

众所周知,有时候我们需要将sql查询返回的DataTable转换为类。最开始是使用循环一个个给类的属性赋值,但是这样效率低并且无法复用。

后来了解到利用DataTable添加扩展方法可以轻松的实现这一功能

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DataTableEx
{
    public static class DataTableEx
    {
        public static List<T> ToList<T>(this DataTable dt) where T : new()
        {
            List<T> ts = new List<T>();
            foreach (DataRow dr in dt.Rows)
            {
                T t = new T();
                foreach (var c in dt.Columns)
                {
                    object value = dr[c.ToString()];
                    if (value != DBNull.Value)
                    {
                        var p = t.GetType().GetProperty(c.ToString());
                        if (p != null)
                        {
                            p.SetValue(t, ConvertHelper.ChangeType(value, p.PropertyType), null);
                        }
                    }
                }
                ts.Add(t);
            }
            return ts;
        }


        public static T ToData<T>(this DataTable dt) where T : new()
        {
            if (dt.Rows.Count>1)
            {
                throw new Exception("");
            }
            List<T> ts = new List<T>();
            foreach (DataRow dr in dt.Rows)
            {
                T t = new T();
                foreach (var c in dt.Columns)
                {
                    object value = dr[c.ToString()];
                    if (value != DBNull.Value)
                    {
                        var p = t.GetType().GetProperty(c.ToString());
                        if (p != null)
                        {
                            p.SetValue(t, ConvertHelper.ChangeType(value, p.PropertyType), null);
                        }
                    }
                }
                return t;
            }
            return default(T);
        }

        public static void  FillData<T>(this DataTable dt,ref T t) where T : new()
        {
            if (dt.Rows.Count > 1)
            {
                throw new Exception("");
            }
            foreach (DataRow dr in dt.Rows)
            {
        
                foreach (var c in dt.Columns)
                {
                    object value = dr[c.ToString()];
                    if (value != DBNull.Value)
                    {
                        var p = t.GetType().GetProperty(c.ToString());
                        if (p != null)
                        {
                            p.SetValue(t, ConvertHelper.ChangeType(value, p.PropertyType), null);
                        }
                    }
                }
            }
        }

    }
}

上面三个方法

1. 将DataTable转化为List<T>,使用DataTable.ToList<T>();

2. 将DataTable转化为<T>,使用DataTable.ToData<T>();

3. 填充已有<T>内容,使用DataTable.FillData<T>();

注:

1. ConvertHelper类请参考 https://www.cnblogs.com/axiaoshuye/articles/15697734.html

2. 转换的前提条件是DataTable字段名要与对应类的属性名一致

标签:using,C#,value,ToString,CSharpTips,为类,new,dt,DataTable
From: https://www.cnblogs.com/axiaoshuye/p/15868256.html

相关文章

  • 并发多线程11std::atomic续谈、std::async深入谈
    std::atomic续谈、std::async深入谈一、std::atomic续谈#include<iostream>#include<thread>#include<atomic>usingnamespacestd;std::atomic<int>g_count=......
  • Python中OpenCV库(二)
    目录OpenCV库(二)五、图像直方图1、基本概念2、统计函数3、绘制直方图3.1matplotlib3.2OpenCV4、使用掩膜的直方图六、视频采集1、打开视频2、读取数据3、视频属性......
  • (课设)C/S架构即时聊天软件开发(QT)
     (课设)C/S架构即时聊天软件开发源点工作室毕设,作业,论文,考试疑难解答,源码均有,看简介加我。 3人赞同了该文章一、引言项目概述项目目的:在已......
  • ClickHouse 安装部署
    1、前置环境准备1.1、查看是否存在旧版本ClickHouse [hui@hadoop201~]$rpm-qa|grepclickhouse如果存在安装数据可以卸载yumremove-yclickhouse-common-sta......
  • Your local changes to the following files would be overwritten by checkout问题的
    Yourlocalchangestothefollowingfileswouldbeoverwrittenbycheckout问题的解决 于2018-07-1711:38:27发布Git的本地版本管理有三个部分名称 说明工作......
  • [CSharpTips]C# 读写INI文件
    读写.ini文件工具可以直接使用usingSystem;usingSystem.Collections.Generic;usingSystem.IO;usingSystem.Runtime.InteropServices;usingSystem.Text;names......
  • 给Docker集群中Label节点打上标签与服务约束
    https://www.cnblogs.com/caoweixiong/p/12382282.htmlLabel作用:在服务器中通常需要将某个服务固定在某一台机器上运行的时候,可以给集群中的机器打上标签......
  • JavaDOC
    示例代码/***@authorMMF*@version1.0*@since1.8*/publicclassDoc{Stringname;/***@authorMMF*@paramname用户名*......
  • Tomcat安装及环境变量配置
    Tomcat下载及安装Step①:进入Tomcat官网:WelcometoTheApacheSoftwareFoundation! 首字母T的指引下,找到Tomcat。 Download下边的版本,这里最新的是10.x版本,但是......
  • logback.xml 配置文件
    logback.xml<?xmlversion="1.0"encoding="UTF-8"?><configuration><!--定义日志文件的存储地址勿在LogBack的配置中使用相对路径--><!--<propertynam......