EF架構~性能高效的批量操作(Insert篇)


回到目錄

無論是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         }

之后我將陸續把更新操作與刪除操作及對增刪改操作進行封裝,獻給大家,盡請期待。

回到目錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM