当前位置: 首页 > news >正文

EF架构~性能高效的批量操作(Insert篇)

回到目录

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

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

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

代码如下:

 1   /// <summary>
 2         /// 构建Insert语句串
 3         /// 主键为自增时,如果主键值为0,我们将主键插入到SQL串中
 4         /// </summary>
 5         /// <typeparam name="TEntity"></typeparam>
 6         /// <param name="entity"></param>
 7         /// <returns></returns>
 8         private Tuple<string, object[]> CreateInsertSQL<TEntity>(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) != null
17                && (i.PropertyType.IsValueType || i.PropertyType == typeof(string)))
18                .ToArray();//过滤主键,航行属性,状态属性等
19             List<string> pkList = GetPrimaryKey<TEntity>().Select(i => i.Name).ToList();
20 
21             List<object> arguments = new List<object>();
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                     else
44                         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<string, object[]>(fieldbuilder.ToString(), arguments.ToArray());
58         }

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

回到目录

相关文章:

  • user-agent 验证移动端请求
  • python用zipfile模块打包文件或是目录、解压zip文件实例
  • 模块化(学习笔记)
  • HDU 4048 Zhuge Liang's Stone Sentinel Maze [组合数学+Burnside]
  • swap file *.swp already exists问题解决!!!
  • [G-CS-MR.PS02] 機巧之形2: Ruler Circle
  • Eclipse开发环境配置,打磨Eclipse,安装插件(适用3.4,3.5,3.6,3.7)
  • 八、Maven下进行单元测试
  • Java反编译利器-Jad, Jode, Java Decompiler等及其IDE插件
  • 在阿里云创建子域名,配置nginx,使用pm2部署node项目到ubuntu服务器
  • 求数组中只出现一次的数字(算法)
  • 黄聪:公众号怎么用微信做出点击此处查看答案
  • 远程调用
  • Kinect+OpenNI学习笔记之12(简单手势所表示的数字的识别)
  • 超强大的响应式图表工具 (Echarts)
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • angular组件开发
  • canvas 绘制双线技巧
  • Elasticsearch 参考指南(升级前重新索引)
  • vue:响应原理
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 工程优化暨babel升级小记
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 开源地图数据可视化库——mapnik
  • 聊一聊前端的监控
  • 驱动程序原理
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 推荐一个React的管理后台框架
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • #1015 : KMP算法
  • #define 用法
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (145)光线追踪距离场柔和阴影
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (十)c52学习之旅-定时器实验
  • (循环依赖问题)学习spring的第九天
  • .Family_物联网
  • .NET Core中Emit的使用
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • :O)修改linux硬件时间
  • @ConditionalOnProperty注解使用说明
  • @ModelAttribute使用详解
  • [ C++ ] 继承
  • [100天算法】-不同路径 III(day 73)
  • [2016.7 test.5] T1
  • [2018-01-08] Python强化周的第一天
  • [28期] lamp兄弟连28期学员手册,请大家务必看一下
  • [AIGC] Redis基础命令集详细介绍
  • [BUUCTF]-PWN:[极客大挑战 2019]Not Bad解析
  • [Bzoj4722]由乃(线段树好题)(倍增处理模数小快速幂)
  • [c#基础]值类型和引用类型的Equals,==的区别
  • [C\C++]读入优化【技巧】
  • [cb]UIGrid+UIStretch的自适应
  • [DM复习]关联规则挖掘(下)
  • [HackMyVM]靶场Boxing