InsertOnSubmit、InsertAllOnSubmit等区别 (转)

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站内文章除注明原创外,均为转载,整理或搜集自网络.欢迎任何形式的转载,转载请注明出处.
时间: 2024-11-06 09:39:40

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

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

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

Nginx 反代参数:$X-Real-Ip和$X-Forwarded-For的区别

## \$X-Real-Ip和$X-Forwarded-For的区别 标签(空格分隔): nignx 负载均衡 client-ip --- ####1.如果只有一层代理,这两个头的值就是一样的####2.多层代理> * X-Forwarded-For:  header包含这样一行        `*X-Forwarded-For: 1.1.1.1, 2.2.2.2, 3.3.3.3*`> * X-Real-Ip:没有相关标准,上面的例子,如果配置了X-Read-IP,可能会有两种情况`// 最

C#中Convert和parse的区别

Convert.ToInt32()与int.Parse()的区别(1)这两个方法的最大不同是它们对null值的处理方法: Convert.ToInt32(null)会返回0而不会产生任何异常,但int.Parse(null)则会产生异常. 没搞清楚Convert.ToInt32和int.Parse()的细细微区别时千万别乱用,否则可能会产生无法预料的结果,举例来说:假如从url中取一个参数page的值,我们知道这个值是一个int,所以即可以用Convert.ToInt32(Request.Que

python判断字符串,str函数isdigit、isdecimal、isnumeric的区别

s为字符串s.isalnum() 所有字符都是数字或者字母s.isalpha() 所有字符都是字母s.isdigit() 所有字符都是数字s.islower() 所有字符都是小写s.isupper() 所有字符都是大写s.istitle() 所有单词都是首字母大写,像标题s.isspace() 所有字符都是空白字符.\t.\n.\r 判断是整数还是浮点数a=123b=123.123 >>>isinstance(a,int)True>>>isinstance(b,floa

java web 过滤器跟拦截器的区别和使用

1.首先要明确什么是拦截器.什么是过滤器 1.1 什么是拦截器: 拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作.拦截是AOP的一种实现策略. 在Webwork的中文文档的解释为--拦截器是动态拦截Action调用的对象.它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行.同时也是提供了一种可以提取action中可重用的部分的方式.

mysql中int、bigint、smallint和tinyint的区别与长度

对比发现 int bigint smallint 和 tinyint 类型,如果创建新表时没有指定 int(M) 中的M时,默认分别是 : int             -------     int(11) bigint       -------     bigint(20) smallint   -------     smallint(6) tinyint     -------     tinyint(4) 下面是这几种类型的取值范围 参考:http://www.2cto.com/d

call和apply和bind的区别

在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向. JavaScript 的一大特点是,函数存在「定义时上下文」和「运行时上下文」以及「上下文是可以改变的」. apply(): 将函数作为指定对象的方法来调用,传递给它的是指定的参数数组function.apply(thisobj, args) 或者 function.apply(thisobj, args) 1.thisobj

mybatis中&quot;#&quot;和&quot;$&quot;的区别

mybatis中"#"和"$"的区别 动态 sql 是 mybatis 的主要特性之一,在 mapper 中定义的参数传到 xml 中之后,在查询之前 mybatis 会对其进行动态解析.mybatis 为我们提供了两种支持动态 sql 的语法:#{} 以及 ${}. 在下面的语句中,如果 username 的值为 zhangsan,则两种方式无任何区别: select * from user where name = #{name}; select * from

mybatis与hibernate的区别

本文转载自:http://blog.csdn.net/wangpeng047/article/details/17038659 以前没怎么用过mybatis,只知道与hibernate一样是个orm数据库框架.随着使用熟练度的增加,发现它与hibernate区别是非常大的,结合至今为止的经验,总结出以下几点: 1. hibernate是全自动,而mybatis是半自动. hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成sql