a. InsertOnSubmit: 将一个实体添加到datacontext对象中,并在SubmitChange()的时候执行更改。

b. InsertAllOnSubmit:将一个实体集合添加到datacontext对象中,并在SubmitChange()的时候执行更改。

例:

UsersDataContext dal = new UsersDataContext();

User[] user = new User[3]

{

new User { UserName = "Lily", UserPass = "Lily" },

new User { UserName = "Lucy", UserPass = "Lucy" },

new User { UserName = "Tom", UserPass = "Tom" },

};

User user1 = new User { UserName = "Bill", UserPass = "Bill" };

dal.Users.InsertAllOnSubmit(user);//添加实体集合

dal.Users.InsertOnSubmit(user1);//添加单个实体

dal.SubmitChanges();

以上结果为向数据库Users表中增加数据。

※注:以上两个函数必须要跟随SubmitChange()函数才能提交到数据库中。我们可以通俗的理解为:以上两个函数仅仅相当于一条Sql语句,而SubmitChange()相当于执行此条Sql语句。


DeleteAllOnSubmit和InsertAllOnSubmit传进去的参数是一个继承IEnumerable接口的集合,当你调用SubmitChanges()的时候,整个集合会被删除(添加);
DeleteOnSubmit和InsertOnSubmit传进去的参数是一个Object对象,调用SubmitChanges()时对单个对象进行删除(添加)

   无论是Linq To SQL还是Linq To Object(Entity frameworks)它们都为开发人员提供了Insert操作,及Insert集合操作,即InsertOnSubmit和 InsertAllOnSubmit,前者是将一个实体标记为一个插入状态,而后都是将一个集合标记为插入状态,... 

无论是Linq To SQL还是Linq To Object(Entity frameworks)它们都为开发人员提供了Insert操作,及Insert集合操作,即InsertOnSubmit和 InsertAllOnSubmit,前者是将一个实体标记为一个插入状态,而后都是将一个集合标记为插入状态,而当前进行这两种操作时,你并没有与数据 库进行连接,这就是LINQ提倡的延时加载,那它们什么时候与数据库进行真正的交互呢,实现上,实验表明,是在触发SubmitChanges方法时,才 会真实与数据库进行操作,这是正常的,也没有什么可以说的。

而今天我主要说的就是,当我们进行批量插入时,用linq给我们提供的InsertAllOnSubmit方法是否可以实现我们的操作,如果实现了,那是否是我们能够接受的方式,我们在做一个实验吧

一个列表:

List userList=new List();
                    
 for(int i=0;i<100000;i++)
 {
   userList.Add(new User{Name="zzl"+i});
 }
 _db.InsertAllOnSubmit(userList);
                    
_db.SubmitChanges();

结果怎么样呢?经过我的观察,结果是正确的,10万条数据可以插入到数据库中,LINQ确实是帮助我们完成了列表的插入工作,但过程我们是否可以接受?

可以肯定的说,不可以,而且是非常不可以,对于这个插入操作,它对数据服务器的压力是惊人的,它建立“链接”次为10万次,即每个Insert语句就建立一个链接,这是我们不能接受的,所以,LINQ的批量操作确实靠不住。
OK,既然LINQ的方式是不可取的,那我们只好自己去动手写了,呵呵,我们的思想去将10条Insert合并在一起,一次性发给服务器,一次性执行,对于目前的网络带宽这10条数据不成问题,呵呵。

一 单个实体的Insert,我们采用LINQ的延时插入方式:

public virtual void Insert(TEntity entity) where TEntity : class
       {
          DB.GetTable().InsertOnSubmit(entity);
           this.SubmitChanges();
      }

二 批量插入实体,我们采用拼接字符串,并向数据服务器发命令的方式,这个也是我比较满足的作品,它是一个通用的方式,并且不需要修改原来插入代码,它的

方法签名是一个列表,这样做是正确的,对于程序员来说是非常友好的。

先看之前的LINQ批量插入:

public virtual void Insert(IEnumerable list) where TEntity : class
       {
           DB.GetTable().InsertAllOnSubmit(list);
           this.SubmitChanges();
       }
而在我们修改后,方法签名是不变的,所以原来调用它的方法,不需要进行修改:

1         ///

2         /// ADO优化的批量添加 
3         ///

4         ///

5         ///

6         public virtual void Insert

(IEnumerable list) where TEntity : class 
7         {
8             this.InsertForADO(list);
9         }
所需要的辅助方法: 1 #region LINQ调用T-SQL实现批量添加
2         ///
3         /// 得到数据库表或视图的抽象
4         ///
5         ///
6         ///
7         MetaTable GetMetaTable(Type rowType)
8         {
9             return DB.Mapping.GetTable(rowType);
10         }
11
12         ///
13         /// 建立SQL语句
14         ///
15         ///
16         ///
17         Tuple CreateInsertArguments(TEntity entity)
18         {
19             if (entity == null)
20                 throw new ArgumentException("The database entity can not be null.");
21
22             Type entityType = entity.GetType();
23             MetaTable table = GetMetaTable(entityType);
24             MetaDataMember identityDatamember = table.RowType.DBGeneratedIdentityMember;
25
26             List arguments = new List();
27             StringBuilder fieldbuilder = new StringBuilder();
28             StringBuilder valuebuilder = new StringBuilder();
29
30             fieldbuilder.Append("INSERT INTO " + table.TableName + " (");
31
32             foreach (var member in table.RowType.PersistentDataMembers)
33             {
34
35                 if (!member.IsAssociation && !member.IsDbGenerated)
36                 {
37                     object value = entityType.GetProperty(member.Name).GetValue(entity, null);
38                     if (value != null)
39                     {
40                         if (arguments.Count != 0)
41                         {
42                             fieldbuilder.Append(", ");
43                             valuebuilder.Append(", ");
44                         }
45
46                         fieldbuilder.Append(member.MappedName);
47                         if (member.Type == typeof(string) || member.Type == typeof(DateTime))
48                             valuebuilder.Append("'{" + arguments.Count + "}'");
49                         else
50                             valuebuilder.Append("{" + arguments.Count + "}");
51                         if (value.GetType() == typeof(string))
52                             value = value.ToString().Replace("'", "char(39)");
53                         arguments.Add(value);
54
55                     }
56                 }
57             }
58
59
60             fieldbuilder.Append(") Values (");
61
62             fieldbuilder.Append(valuebuilder.ToString());
63             fieldbuilder.Append(");");
64             return new Tuple(fieldbuilder.ToString(), arguments.ToArray());
65         }
66
67         void InsertForADO(IEnumerable list)
68         {
69             StringBuilder sqlstr = new StringBuilder();
70             list.ToList().ForEach(i =>
71             {
72                 Tuple insert = CreateInsertArguments(i);
73                 sqlstr.AppendFormat(insert.Item1, insert.Item2);
74             });
75             DB.ExecuteCommand(sqlstr.ToString());
76         }
77
78         #endregion
       169IT站内文章除注明原创外,均为转载,整理或搜集自网络.欢迎任何形式的转载,转载请注明出处.

InsertOnSubmit、InsertAllOnSubmit等区别 (转)的更多相关文章

  1. Linq To SQL和Linq To Object的批量操作InsertAllOnSubmit介绍

    无论是Linq To SQL还是Linq To Object(Entity frameworks)它们都为开发人员提供了Insert操作,及Insert集合操作,即InsertOnSubmit和Ins ...

  2. c#与java的区别

    经常有人问这种问题,用了些时间java之后,发现这俩玩意除了一小部分壳子长的还有能稍微凑合上,基本上没什么相似之处,可以说也就是马甲层面上的相似吧,还是比较短的马甲... 一般C#多用于业务系统的开发 ...

  3. jquery和Js的区别和基础操作

    jqery的语法和js的语法一样,算是把js升级了一下,这两种语法可以一起使用,只不过是用jqery更加方便 一个页面想要使用jqery的话,先要引入一下jqery包,jqery包从网上下一个就可以, ...

  4. 【原】nodejs全局安装和本地安装的区别

    来微信支付有2年多了,从2年前的互联网模式转变为O2O模式,主要的场景是跟线下的商户去打交道,不像以往的互联网模式,有产品经理提需求,我们帮忙去解决问题. 转型后是这样的,团队成员更多需要去寻找业务的 ...

  5. 探究@property申明对象属性时copy与strong的区别

    一.问题来源 一直没有搞清楚NSString.NSArray.NSDictionary--属性描述关键字copy和strong的区别,看别人的项目中属性定义有的用copy,有的用strong.自己在开 ...

  6. X86和X86_64和X64有什么区别?

    x86是指intel的开发的一种32位指令集,从386开始时代开始的,一直沿用至今,是一种cisc指令集,所有intel早期的cpu,amd早期的cpu都支持这种指令集,ntel官方文档里面称为&qu ...

  7. Java中Comparable与Comparator的区别

    相同 Comparable和Comparator都是用来实现对象的比较.排序 要想对象比较.排序,都需要实现Comparable或Comparator接口 Comparable和Comparator都 ...

  8. MySQL中interactive_timeout和wait_timeout的区别

    在用mysql客户端对数据库进行操作时,打开终端窗口,如果一段时间没有操作,再次操作时,常常会报如下错误: ERROR (HY000): Lost connection to MySQL server ...

  9. 设置line-height:1.5和line-height:150%或者line-height:150px的区别

    直接正题: 看一下line-height可能的值: 其实可以分为两类: (1)不带单位的(如line-height:1.5),这种是推荐使用的: (2)带单位的(如line-heigth:30px/1 ...

随机推荐

  1. android编程——百度地图初探

    项目需要,花了一天时间研究了下百度地图的API,其实看起来可能会有点困难,但是将它的DEMO跑起来之后一切都迎刃而解的样子了.百度方面讲地图的接口封装的挺不错的,而且现在能够提供的地图的服务也有将近十 ...

  2. linux搭建java环境

    建议使用EXCEL查看 准备文件 apache-tomcat-7.0.57.tar tomcat web容器 server-jre-7u76-linux-x64.tar  java jdk java执 ...

  3. android应用如何启动另外一个apk应用

    在开发的过程中,经常会遇到在一个应用中启动另外一个apk应用的情况 问题的核心点在于我们要拿到第三方apk的package名称跟class名称, 如:package名称是com.funcity.tax ...

  4. Cocoapods安装步骤

    Cocoapods安装步骤 1.升级Ruby环境 终端输⼊入:$ gem update --system 此时会出现 ERROR: While executing gem ... (Gem::File ...

  5. iOS UIWebView 之 UIProgressView

    之前做等待跳转都是用UIActivityIndicatorView ,后来做webView 加载页面的时候,发现了一个特别好用又超级炫酷的加载提示NJKWebViewProgress,作者巧妙的通过计 ...

  6. php定时输出

    //PHP定时输出 ob_end_flush(); //关闭输出缓冲 set_time_limit(0); //设置最大执行时间为无限制 echo '============开始=========== ...

  7. CGroup 介绍、应用实例及原理描述

    CGroup 介绍 CGroup 是 Control Groups 的缩写,是 Linux 内核提供的一种可以限制.记录.隔离进程组 (process groups) 所使用的物力资源 (如 cpu ...

  8. ZOJ 3879 Capture the Flag 15年浙江省赛K题

    每年省赛必有的一道模拟题,描述都是非常的长,题目都是蛮好写的... sigh... 比赛的时候没有写出这道题目 :( 题意:首先输入4个数,n,q,p,c代表有n个队伍,q个服务器,每支队伍的初始分数 ...

  9. 使用jstl 截取字符串

    时常碰见这样的 问题:获取数据库中的文本域的时候经常是在p标签中的,在页面显示的时候也是带着p标签,如何去除p标签呢 这里提供一个使用jstl的方式 1.首先导入jstl的函数标签库 <%@ t ...

  10. Mysql 启动失败 报错 1067

    Mysql装好后,重启电脑第二次发现服务无法启动.提示如下: ------------------------ MySQL 服务无法启动. 系统出错. 发生系统错误 1067. 进程意外终止. --- ...