无论是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 }
之后我将陆续把更新操作与删除操作及对增删改操作进行封装,献给大家,尽请期待。
本文转自博客园张占岭(仓储大叔)的博客,原文链接:EF架构~性能高效的批量操作(Insert篇),如需转载请自行联系原博主。