首页 > 数据库 >ORM中SqlUtility增加将数据表转成实体集合的多线程版本

ORM中SqlUtility增加将数据表转成实体集合的多线程版本

时间:2023-01-26 19:33:24浏览次数:42  
标签:Tables rowList List 数据表 ORM new 多线程 ds row

public sealed class SqlUtility
{
        /// <summary>
        /// 多线程
        /// 获取SQL执行结果<br/>
        /// 用属性的Set方法赋值
        /// </summary>
        /// <typeparam name="TModel">返回数据类型</typeparam>
        /// <param name="dbName">数据库名</param>
        /// <param name="sql">SQL</param>
        /// <param name="sqlParams">SQL参数w集合</param>
        /// <param name="propertys">返回实体的属性集合</param>
        /// <param name="rowCount">输出总行数</param>
        /// <returns>查询结果集合</returns>
        public static List<TModel> GetExeResultToListTask<TModel, SqlParameter, DataReader>(IDbHelper<SqlParameter, DataReader> dbHelper, string dbName, string sql, List<SqlParameter> sqlParams, Dictionary<string, PropertyInfo> propertys, out int rowCount)
            where TModel : IModel, new()
            where SqlParameter : DbParameter
            where DataReader : DbDataReader
        {
            var dbModelList = new List<TModel>();
            rowCount = 0;
            //mySql查询
            var ds = dbHelper.QueryRead<DataSet>(dbName, sql, sqlParams.ToArray());
            TModel newT = default(TModel);
            if (ds != null && ds.Tables.Count == 2)
            {
                using (ds)
                {
                    //获取总行数
                    int.TryParse(ds.Tables[1].Rows[0][0].ToString(), out rowCount);
                    if (ds.Tables[0].Rows.Count >= 100)
                    {
                        //多线程
                        //10个线程
                        int taskRowCount = ds.Tables[0].Rows.Count / 10;
                        if (ds.Tables[0].Rows.Count % 10 != 0)
                        {
                            taskRowCount++;
                        }
                        var list = new List<List<DataRow>>(10);                        
                        //1.先分任务
                        List<DataRow> rowList = null;
                        var taskList = new List<Task<List<TModel>>>(10);
                        var i = 1;
                        foreach (DataRow row in ds.Tables[0].Rows)
                        {
                            if (i == 1 || i > taskRowCount)
                            {
                                rowList = new List<DataRow>();
                                list.Add(rowList);
                                rowList.Add(row);
                                i = 2;
                            }
                            else
                            {
                                rowList.Add(row);
                                i++;
                            }
                        }
                        //开10个线程处理
                        for (int t = 0; t < list.Count; t++)
                        {
                            List<DataRow> taskRowList = list[t];
                            var task = Task.Run(() => tableToModelList<TModel>(taskRowList, propertys));
                            taskList.Add(task);
                        }
                        Task.WaitAll(taskList.ToArray());
                        foreach (Task<List<TModel>> itemTask in taskList)
                        {
                            dbModelList.AddRange(itemTask.Result);
                        }
                        //清除变量,让GC快速回收
                        rowList = null;
                        taskList = null;
                        list = null;
                    }
                    else
                    {
                        //单线程
                        foreach (DataRow row in ds.Tables[0].Rows)
                        {
                            //用属性的Set方法赋值
                            newT = newModel<TModel>(propertys, row);
                            dbModelList.Add(newT);
                        }
                    }
                }
            }
            return dbModelList;
        }

        private static List<TModel> tableToModelList<TModel>(List<DataRow> rowList, Dictionary<string, PropertyInfo> propertys) where TModel : IModel, new()
        {
            var modelList = new List<TModel>();
            if (rowList != null && rowList.Count > 0)
            {
                foreach (DataRow row in rowList)
                {
                    modelList.Add(newModel<TModel>(propertys, row));
                }
            }
            return modelList;
        }
}

 

标签:Tables,rowList,List,数据表,ORM,new,多线程,ds,row
From: https://www.cnblogs.com/stevenchen2016/p/17068110.html

相关文章

  • 【AAAI2023】Head-Free Lightweight Semantic Segmentation with Linear Transformer
    论文:【AAAI2023】Head-FreeLightweightSemanticSegmentationwithLinearTransformer代码:https://github.com/dongbo811/AFFormer这是来自阿里巴巴的工作,作者构建了......
  • 多线程锁的基本语法
         ......
  • 获取WinForm窗体的宽度和高度
    我在VS2005中新建了一个C#窗体应用程序,该程序只有一个窗体,窗体的变量名为Form1刚开始时我是这样获取Form1的宽度和高度的:int  width=Form1.Width;int  height=Form1.......
  • Huggingface简介及BERT tansformer 开源
    Huggingface简介及BERT代码浅析importtorchfromtransformersimportBertModel,BertTokenizer#这里我们调用bert-base模型,同时模型的词典经过小写处理model_name='ber......
  • transformer
    ​​Transformer:Pytorch版本的源码解析​​​​Transformer源码详解(Pytorch版本)​​​​史上最小白之Transformer详解​​​​Transformer详解(看不懂你来骂我​​......
  • Unix\Linux多线程复健(二)线程同步
    线程同步并非让线程并行,而是有先后的顺序执行,当有一个线程对内存操作时,其他线程不可以对这个内存地址操作线程之间的分工合作线程的优势之一:能够通过全局变量共享信息......
  • Rank Transform of a Matrix
    RankTransformofaMatrixGivenan mxn matrix ,returnanewmatrix answer where answer[row][col] istherank of matrix[row][col] .Therankisan......
  • Informer源代码学习记录之“数据集处理”
    一、源码代码核心exp_informer.py: #获取数据集处理类, 选取的数据集为'weather',数据集处理类Dataset_CustomData=data_dict[self.args.dat......
  • Informer源码学习记录之 "模型搭建build_model"
    一、初始化1.代码结构main_informer.py:  exp=Exp(args)#setexperimentsexp_basic.py:classExp_Informer(E......
  • 多线程案例-实现定时器
    1.定时器是什么定时器是软件开发中的一个重要组件,功能是当达到一个特定的时间后,就执行某个指定好的代码定时器是一个非常常用的组件,特别是在网络编程中,当出现了"连接......