博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EF架构~性能高效的批量操作(Insert篇)
阅读量:7067 次
发布时间:2019-06-28

本文共 2268 字,大约阅读时间需要 7 分钟。

无论是linq to sql 还是entity frameworks,在进行列表操作时都会有一个毛病,那就是它的操作只能一个实体一个实体的发到服务器,这样,如果列表的数量很大,如列表为10万条数据,那么,这种操作将是非常性能的,可能你的DB就挂了。

解决方案:拼接T—SQL串,并使它具有通用性

好处:与服务器建立一次连接,给服务器发一条SQL命令,即可实现

代码如下:

1   ///  2         /// 构建Insert语句串 3         /// 主键为自增时,如果主键值为0,我们将主键插入到SQL串中 4         ///  5         /// 
6 /// 7 ///
8 private Tuple
CreateInsertSQL
(TEntity entity) where TEntity : class 9 {10 if (entity == null)11 throw new ArgumentException("The database entity can not be null.");12 13 Type entityType = entity.GetType();14 var table = entityType.GetProperties().Where(i => i.PropertyType != typeof(EntityKey)15 && i.PropertyType != typeof(EntityState)16 && i.GetValue(entity, null) != null17 && (i.PropertyType.IsValueType || i.PropertyType == typeof(string)))18 .ToArray();//过滤主键,航行属性,状态属性等19 List
pkList = GetPrimaryKey
().Select(i => i.Name).ToList();20 21 List
arguments = new List();22 StringBuilder fieldbuilder = new StringBuilder();23 StringBuilder valuebuilder = new StringBuilder();24 25 fieldbuilder.Append(" INSERT INTO " + string.Format("[{0}]", entityType.Name) + " (");26 27 foreach (var member in table)28 {29 if (pkList.Contains(member.Name) && Convert.ToString(member.GetValue(entity, null)) == "0")30 continue;31 object value = member.GetValue(entity, null);32 if (value != null)33 {34 if (arguments.Count != 0)35 {36 fieldbuilder.Append(", ");37 valuebuilder.Append(", ");38 }39 40 fieldbuilder.Append(member.Name);41 if (member.PropertyType == typeof(string) || member.PropertyType == typeof(DateTime))42 valuebuilder.Append("'{ " + arguments.Count + "}'");43 else44 valuebuilder.Append("{ " + arguments.Count + "}");45 if (value.GetType() == typeof(string))46 value = value.ToString().Replace("'", "char(39)");47 arguments.Add(value);48 49 }50 }51 52 53 fieldbuilder.Append(") Values (");54 55 fieldbuilder.Append(valuebuilder.ToString());56 fieldbuilder.Append(");");57 return new Tuple
(fieldbuilder.ToString(), arguments.ToArray());58 }

之后我将陆续把更新操作与删除操作及对增删改操作进行封装,献给大家,尽请期待。

转载地址:http://uqtll.baihongyu.com/

你可能感兴趣的文章
Ubuntu 下新建用户
查看>>
gulp配置
查看>>
linux命令截取文件最后n行(所有命令)
查看>>
linux提取指定列字符并打印所有内容(awk)
查看>>
减治算法求n个数中的最小数的位置
查看>>
css3学习 理论之文本
查看>>
Linux 安装python3.7.0
查看>>
<Linux命令行学习 第二节> CentOS - 远程登录管理工具
查看>>
[转]BEHAVOUR TREE2
查看>>
深入理解计算机操作系统(十)
查看>>
XML和Schema命名空间详解
查看>>
npm ERR! Unexpected end of JSON input while parsing near '...inimist":"^1.2.0"}
查看>>
Mybatis Generator逆向工程的使用
查看>>
设计模式(八)_门面模式
查看>>
BFS - 水题
查看>>
软件面试常见题目(转帖)
查看>>
[LeetCode] NO. 387 First Unique Character in a String
查看>>
理解管理信息系统
查看>>
UVA 11991 - Easy Problem from Rujia Liu?
查看>>
CF1101E Polycarp's New Job
查看>>