您好,欢迎访问一九零五行业门户网

LINQ-to-SQL那点事~利用反射在LINQ-to-SQL环境中实现Ado.net的CU

回到目录 对于linq to sql提供的curd 操作 ,给我们的感觉就是简单,容易使用,更加面向对象,不用拼sql语句了,这些好处都表示在处理单条实体或者集合长度小的情况下,如果有一个1000条的集合实体,希望进行update 操作 ,如果你还用linq to sql提代的updat
回到目录
对于linq to sql提供的curd操作,给我们的感觉就是简单,容易使用,更加面向对象,不用拼sql语句了,这些好处都表示在处理单条实体或者集合长度小的情况下,如果有一个1000条的集合实体,希望进行update操作,如果你还用linq to sql提代的update,那你服务器就快要挂了,呵呵。
为什么呢?对于linq提借的命令,如update(list),它会把list进行foreache的遍历,然后一条一条指令的向sqlserver发送,好家伙,这要是1000,1w条实体的集合,进行update操作,这个对io的开销和服务器的性能来说都是没法接受的,呵呵,应该是一个sql链接,一个指令,就能解决问题呀!
自己封套性能更好的curd集合操作(选自我的entity framework架构,linq to sql没来的及实现)
/// /// sql操作类型 /// protected enum sqltype { insert, update, delete, } /// /// 构建update语句串 /// /// /// /// private tuplestring, object[]> createupdatesql(tentity entity) where tentity : class { if (entity == null) throw new argumentexception(the database entity can not be null.); liststring> pklist = getprimarykey().select(i => i.name).tolist(); type entitytype = entity.gettype(); var table = entitytype.getproperties().where(i => !pklist.contains(i.name) && i.getvalue(entity, null) != null && i.propertytype != typeof(entitystate) && !(i.getcustomattributes(false).length > 0 && i.getcustomattributes(false).where(j => j.gettype() == typeof(navigationattribute)) != null) && (i.propertytype.isvaluetype || i.propertytype == typeof(string)) //过滤导航属性 ).toarray(); //过滤主键,航行属性,状态属性等 if (pklist == null || pklist.count == 0) throw new argumentexception(the table entity have not a primary key.); listobject> arguments = new listobject>(); stringbuilder builder = new stringbuilder(); foreach (var change in table) { if (pklist.contains(change.name)) continue; if (arguments.count != 0) builder.append(, ); builder.append(change.name + = { + arguments.count + }); if (change.propertytype == typeof(string) || change.propertytype == typeof(datetime)) arguments.add(' + change.getvalue(entity, null).tostring().replace(', char(39)) + '); else arguments.add(change.getvalue(entity, null)); } if (builder.length == 0) throw new exception(没有任何属性进行更新); builder.insert(0, update + string.format([{0}], entitytype.name) + set ); builder.append( where ); bool firstprimarykey = true; foreach (var primaryfield in pklist) { if (firstprimarykey) firstprimarykey = false; else builder.append( and ); object val = entitytype.getproperty(primaryfield).getvalue(entity, null); builder.append(getequalstatment(primaryfield, arguments.count)); arguments.add(val); } return new tuplestring, object[]>(builder.tostring(), arguments.toarray()); } /// /// 构建delete语句串 /// /// /// /// private tuplestring, object[]> createdeletesql(tentity entity) where tentity : class { if (entity == null) throw new argumentexception(the database entity can not be null.); type entitytype = entity.gettype(); liststring> pklist = getprimarykey().select(i => i.name).tolist(); if (pklist == null || pklist.count == 0) throw new argumentexception(the table entity have not a primary key.); listobject> arguments = new listobject>(); stringbuilder builder = new stringbuilder(); builder.append( delete from + string.format([{0}], entitytype.name)); builder.append( where ); bool firstprimarykey = true; foreach (var primaryfield in pklist) { if (firstprimarykey) firstprimarykey = false; else builder.append( and ); object val = entitytype.getproperty(primaryfield).getvalue(entity, null); builder.append(getequalstatment(primaryfield, arguments.count)); arguments.add(val); } return new tuplestring, object[]>(builder.tostring(), arguments.toarray()); } /// /// 构建insert语句串 /// 主键为自增时,如果主键值为0,我们将主键插入到sql串中 /// /// /// /// private tuplestring, object[]> createinsertsql(tentity entity) where tentity : class { if (entity == null) throw new argumentexception(the database entity can not be null.); type entitytype = entity.gettype(); var table = entitytype.getproperties().where(i => i.propertytype != typeof(entitykey) && i.propertytype != typeof(entitystate) && i.name != isvalid && i.getvalue(entity, null) != null && !(i.getcustomattributes(false).length > 0 && i.getcustomattributes(false).where(j => j.gettype() == typeof(navigationattribute)) != null) && (i.propertytype.isvaluetype || i.propertytype == typeof(string))).toarray();//过滤主键,航行属性,状态属性等 liststring> pklist = getprimarykey().select(i => i.name).tolist(); listobject> arguments = new listobject>(); stringbuilder fieldbuilder = new stringbuilder(); stringbuilder valuebuilder = new stringbuilder(); fieldbuilder.append( insert into + string.format([{0}], entitytype.name) + (); foreach (var member in table) { if (pklist.contains(member.name) && convert.tostring(member.getvalue(entity, null)) == 0) continue; object value = member.getvalue(entity, null); if (value != null) { if (arguments.count != 0) { fieldbuilder.append(, ); valuebuilder.append(, ); } fieldbuilder.append(member.name); if (member.propertytype == typeof(string) || member.propertytype == typeof(datetime)) valuebuilder.append('{ + arguments.count + }'); else valuebuilder.append({ + arguments.count + }); if (value.gettype() == typeof(string)) value = value.tostring().replace(', char(39)); arguments.add(value); } } fieldbuilder.append() values (); fieldbuilder.append(valuebuilder.tostring()); fieldbuilder.append();); return new tuplestring, object[]>(fieldbuilder.tostring(), arguments.toarray()); } /// /// 执行sql,根据sql操作的类型 /// /// /// /// /// protected string dosql(ienumerable list, sqltype sqltype) where tentity : class { stringbuilder sqlstr = new stringbuilder(); switch (sqltype) { case sqltype.insert: list.tolist().foreach(i => { tuplestring, object[]> sql = createinsertsql(i); sqlstr.appendformat(sql.item1, sql.item2); }); break; case sqltype.update: list.tolist().foreach(i => { tuplestring, object[]> sql = createupdatesql(i); sqlstr.appendformat(sql.item1, sql.item2); }); break; case sqltype.delete: list.tolist().foreach(i => { tuplestring, object[]> sql = createdeletesql(i); sqlstr.appendformat(sql.item1, sql.item2); }); break; default: throw new argumentexception(请输入正确的参数); } return sqlstr.tostring(); }
前方永远都是通往成功的路,只要你相信,它就会更快的实现...
回到目录
其它类似信息

推荐信息