在使用非強類型普通DataSet的時候,如果要向DataTable中含有Expression列的話,一般都采用下面 這樣的步驟來提高應用程序的性能。
1.首先使用DataAdapter.Fill方法填充一個DataTable。
2.然後在通過編碼向DataTable中添加Expression列。
3.將這個DataTable作為數據源綁定到相關的控件上(比如DataGridView)。
示例代碼:
1 dataAdapter.Fill(dt);
2 dt.Columns.Add("ItemTotal", typeof(Decimal), "Quantity * UnitPrice");
3 dataGridView.DataSource = dt;
當使用強類型類型化DataSet的時候,由於DataTable中的Expression列已經創建好了,就得另辟方法 來解決性能問題。方法的大體思路是這樣的:
1.在調用Fill方法之前, 遍歷DataTable的所有列,如果該列為Expression則以該列名稱作為Key, Expression表達式作為Value存入一個Hashtable中,然後將該列的Expression屬性設置為空。
2.調用DataAdapter(或者DataTableAdapter)的Fill方法來填充這個DataTable。
3.最後再遍歷DataTable的所有列,判斷Hashtable["列名"]是否存在, 如果存在,則將相應的Value 值賦給該列的Expression屬性,最後清空Hashtable。
示例代碼:
1Hashtable expressionKey = new Hashtable();
2
3//規避DataTable的Expression列,減輕Fill時的負擔
4for (int i = 0; i < targetTable.Columns.Count; i++)
5{
6 if (targetTable.Columns[i].Expression != string.Empty)
7 {
8 expressionKey.Add(targetTable.Columns[i].ColumnName, targetTable.Columns [i].Expression);
9 targetTable.Columns[i].Expression = string.Empty;
10 }
11}
12
13tableAdapter.Fill(targetTable);
14
15//恢復DataTable的Expression列,Fill完了之後進行統一的表達式計算
16for (int i = 0; i < targetTable.Columns.Count; i++)
17{
18 if (expressionKey.ContainsKey(targetTable.Columns[i].ColumnName))
19 {
20 targetTable.Columns[i].Expression =
21 (String)expressionKey[targetTable.Columns[i].ColumnName];
22 }
23}
24
25expressionKey.Clear();
最後測試一下效果如何
使用Northwind數據庫的Order Details表創建一個強類型類型化DataSet來進行測試(約2000多條數據 )。
追加了一個ItemTotal列 Expression = UnitPrice * Quantity
經測試性能比直接Fill大概提高 30%左右, 效果還是比較明顯的。