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. Linux和windows下的shutdown命令

    Linux下的shutdown命令 shutdown [options] [time] [wall] options: --help 获取帮助 -h 关机 -r 重启 -c 取消 -k 仅显示警告信息 ...

  2. jxl读写excel, poi读写excel,word, 读取Excel数据到MySQL

    这篇blog是介绍: 1. java中的poi技术读取Excel数据,然后保存到MySQL数据中. 2. jxl读写excel 你也可以在 : java的poi技术读取和导入Excel了解到写入Exc ...

  3. Exam(贪心)

    Exam Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  4. 巡逻机器人(BFS)

    巡逻机器人问题(F - BFS,推荐) Description   A robot has to patrol around a rectangular area which is in a form ...

  5. [Swust OJ 746]--点在线上(线段树解法及巧解)

    题目链接:http://acm.swust.edu.cn/problem/746/ Time limit(ms): 1000 Memory limit(kb): 65535   fate是一个数学大牛 ...

  6. javascript复制

    1.实现点击按钮,复制文本框中的的内容 1 <scrip type="text/javascript"> 2 function copyUrl2() 3 { 4 var ...

  7. android——ListView功能的实现

    1.main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:a ...

  8. Linux内核启动及根文件系统载入过程

    上接博文<u-boot之u-boot-2009.11启动过程分析> Linux内核启动及文件系统载入过程 当u-boot開始运行bootcmd命令,就进入Linux内核启动阶段.与u-bo ...

  9. VTK中国文字显示和简单的医疗图像浏览软件

    使用VTK做一个简单的医学图像浏览软件(在http://blog.csdn.net/www_doling_net/article/details/8668870这篇博文的基础上改的),支持标准的医学图 ...

  10. hdu1248

    Problem Description 不死族的巫妖王发工资拉,死亡骑士拿到一张N元的钞票(记住,只有一张钞票),为了防止自己在战斗中频繁的死掉,他决定给自己买一些道具,于是他来到了地精商店前. 死亡 ...