首页 > 代码库 > <转> C#中DataTable中的Compute方法使用收集

<转> C#中DataTable中的Compute方法使用收集

Compute函数的参数就两个:Expression,和Filter

Expresstion是计算表达式,关于Expression的详细内容请看这里“http://msdn2.microsoft.com/zh-cn/library/system.data.datacolumn.expression(VS.80).aspx”。而Filter则是条件过滤器,类似sql的Where条件。

[csharp] view plaincopyprint?
    1. DataTable dt = new DataTable();  
    2. //嵌套的三元运算 牛叉到五体投地  
    3. object obj = dt.Compute("iif(1000=5,1000,iif(100>100,4001,2000))", null);  
    4. Response.Write(obj);  
    5.   
    6.   
    7. System.Data.DataTable table = new DataTable();  
    8. //计算常量,可以没有初始化列  
    9. object test = table.Compute("1+1", "");  
    10. Console.WriteLine(test);  
    11.   
    12. string a = "123";  
    13. System.Double b = 123;  
    14. decimal c = 123m;  
    15. Console.WriteLine(Convert.ToDecimal(a));  
    16. //test=2;  
    17.   
    18. test = table.Compute("1+1", "false");  
    19. Console.WriteLine(test);  
    20. //test=2;常数计算和filter无关  
    21.   
    22. test = table.Compute("abs(1)", "");  
    23. Console.WriteLine(test);  
    24. //test=null,不知道为这个什么没有报错,而且返回null,其他的数学函数都会抱错  
    25.   
    26. test = table.Compute("2%2", "");  
    27. Console.WriteLine(test);  
    28. //test=0;  
    29. //其他函数参考下面的计算列  
    30.   
    31.   
    32.   
    33. //初始化datatale  
    34. table.Columns.Add("id", typeof(string));  
    35. table.Columns.Add("value", typeof(int));  
    36. for (int i = 1; i <= 10; i++)  
    37. {  
    38.     System.Data.DataRow dRow = table.NewRow();  
    39.     dRow["id"] = "id" + i.ToString();  
    40.     dRow["value"] = i;  
    41.     table.Rows.Add(dRow);  
    42. }  
    43.   
    44.   
    45.   
    46. //test = table.Compute("value+1", "true");  
    47. /**/  
    48. ////抛出异常,这里必须是聚合函数  
    49.   
    50.   
    51.   
    52. //*************************************支持的聚合函数**********************//  
    53.   
    54. //求数量  
    55. test = table.Compute("count(id)", "false");  
    56. Console.WriteLine(test);  
    57. //test=0;  
    58.   
    59. test = table.Compute("count(id)", "true");  
    60. Console.WriteLine(test);  
    61. //test=10;  
    62.   
    63.   
    64.   
    65. //求和  
    66. test = table.Compute("sum(value)", "");  
    67. Console.WriteLine(test);  
    68. //test=55;  
    69.   
    70. //test = table.Compute("sum(id)","");  
    71. /**/  
    72. ////抛出异常,这里不能是string  
    73.   
    74.   
    75. //平均  
    76. test = table.Compute("avg(value)", "");  
    77. Console.WriteLine(test);  
    78. //test=5;  
    79.   
    80.   
    81. //最小  
    82. test = table.Compute("min(value)", "");  
    83. Console.WriteLine(test);  
    84. //test=1;  
    85.   
    86. //最大  
    87. test = table.Compute("max(value)", "");  
    88. Console.WriteLine(test);  
    89. //test=10;  
    90.   
    91. //统计标准偏差  
    92. test = table.Compute("StDev(value)", "");  
    93. Console.WriteLine(test);  
    94. //test=3.02765035409749  
    95.   
    96. //统计方差  
    97. test = table.Compute("Var(value)", "");  
    98. Console.WriteLine(test);  
    99. //test=9.16666666666667  
    100.   
    101.   
    102. //复杂计算  
    103. test = table.Compute("max(value)/sum(value)", "");  
    104. Console.WriteLine(test);  
    105. //test=0.181818181818182  
    106.   
    107. /**/  
    108. /*******************************************计算列*************************/  
    109.   
    110. System.Data.DataColumn column = new DataColumn("exp1", typeof(float));  
    111. table.Columns.Add(column);  
    112.   
    113.   
    114. //简单计算  
    115. column.Expression = "value*2";  
    116. test = table.Select("id=‘id1‘")[0]["exp1"];  
    117. Console.WriteLine(test);  
    118. //test=2;  
    119.   
    120. //字符串函数  
    121. column.Expression = "len(id)";  
    122. test = table.Select("id=‘id1‘")[0]["exp1"];  
    123. Console.WriteLine(test);  
    124. //test=3;  
    125.   
    126. //字符串函数  
    127. column.Expression = "len(‘ ‘+id+‘ ‘)";  
    128. test = table.Select("id=‘id1‘")[0]["exp1"];  
    129. Console.WriteLine(test);  
    130. //test=5;  
    131.   
    132. //字符串函数  
    133. column.Expression = "len(trim(‘ ‘+id+‘ ‘))";  
    134. test = table.Select("id=‘id1‘")[0]["exp1"];  
    135. Console.WriteLine(test);  
    136. //test=3;  
    137.   
    138. //字符串函数  
    139. column.Expression = "substring(id,3,len(id)-2)";  
    140. test = table.Select("id=‘id1‘")[0]["exp1"];  
    141. Console.WriteLine(test);  
    142. //test=1; //substring的起始字符位置为1不是0  
    143.   
    144. //类型转换  
    145. column.Expression = "convert(substring(id,3,len(id)-2),‘System.Int32‘)*1.6";  
    146. test = table.Select("id=‘id1‘")[0]["exp1"];  
    147. Console.WriteLine(test);  
    148. //test=1.6;  
    149.   
    150. //相当于sqlserver的isnull  
    151. column.Expression = "isnull(value,10)";  
    152. test = table.Select("id=‘id1‘")[0]["exp1"];  
    153. Console.WriteLine(test);  
    154. //test=1;  
    155.   
    156. //三元运算符,相当于sqlserver的case when  
    157. column.Expression = "iif(value>5,1000,2000)";  
    158. test = table.Select("id=‘id1‘")[0]["exp1"];  
    159. Console.WriteLine(test);  
    160. //test=2000;  
    161.   
    162. //like运算符  
    163. column.Expression = "iif(id like ‘%1‘,1000,2000)";  
    164. test = table.Select("id=‘id1‘")[0]["exp1"];  
    165. Console.WriteLine(test);  
    166. //test=1000;  
    167.   
    168. //in运算符  
    169. column.Expression = "iif(id not in(‘id1‘),1000,2000)";  
    170. test = table.Select("id=‘id1‘")[0]["exp1"];  
    171. Console.WriteLine(test);  
    172. //test=2000;  
    173.   
    174. //嵌套的三元运算  
    175. column.Expression = "iif(value>5,1000,iif(id like ‘%1‘,4000,2000))";  
    176. test = table.Select("id=‘id1‘")[0]["exp1"];  
    177. Console.WriteLine(test);  
    178. //test=4000;  
    179.   
    180.   
    181. //客户端计算所占总数的百分比  
    182. column.Expression = "value/sum(value)";  
    183. test = table.Select("id=‘id1‘")[0]["exp1"];  
    184. Console.WriteLine(test);  
    185. //test=0.01818182  
    186.   
    187.   
    188. //客户端计算差值,比如nba常规赛的胜场差  
    189. column.Expression = "max(value)-value";  
    190. test = table.Select("id=‘id1‘")[0]["exp1"];  
    191. Console.WriteLine(test);  
    192. //test=9  
    193.   
    194.   
    195. //***********************父子表计算*************************************/  
    196.   
    197.   
    198. //初始化子表,父子表关系  
    199. DataTable tableChild = new DataTable();  
    200.   
    201. tableChild.Columns.Add("id", typeof(string));  
    202. tableChild.Columns.Add("value", typeof(int));  
    203.   
    204. System.Data.DataSet ds = new DataSet();  
    205. ds.Tables.Add(tableChild);  
    206. ds.Tables.Add(table);  
    207. DataRelation relation = new DataRelation("relation", table.Columns["id"], tableChild.Columns["id"]);  
    208. ds.Relations.Add(relation);  
    209.   
    210. for (int i = 1; i <= 10; i++)  
    211. {  
    212.     System.Data.DataRow dRow = tableChild.NewRow();  
    213.     dRow["id"] = "id1";  
    214.     dRow["value"] = i;  
    215.     tableChild.Rows.Add(dRow);  
    216. }  
    217.   
    218.   
    219. //计算子表记录数  
    220. column.Expression = "count(child(relation).value)";  
    221. test = table.Select("id=‘id1‘")[0]["exp1"];  
    222. Console.WriteLine(test);  
    223. //test=10;  
    224.   
    225.   
    226.   
    227. //计算父子表的百分比  
    228. column.Expression = "value/sum(child(relation).value)";  
    229. test = table.Select("id=‘id1‘")[0]["exp1"];  
    230. Console.WriteLine(test);  
    231. //test=0.01818182;  
    232.   
    233.   
    234. //计算父子表的差值,比如父表为库存数量,子表为订购数量,计算得出需要补充的数量  
    235. column.Expression = "iif(value-sum(child(relation).value)>0,0,value-sum(child(relation).value))";  
    236. test = table.Select("id=‘id1‘")[0]["exp1"];  
    237. Console.WriteLine(test);  
    238. //test=-54;  
    239.   
    240. //比较遗憾的是没有发现能够计算同比和环比的方法,而且计算列无法作为约束  
    241. //结束,DataTable可以让你尽量发挥聪明才智来减少繁杂的sql语句并且减轻服务器计算符合 

<转> C#中DataTable中的Compute方法使用收集