C#中DataTable中的Compute方法使用

转自:http://blog.csdn.net/smartsmile2012/article/details/8309664

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

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

[csharp]  view plain  copy
 print ?
  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语句并且减轻服务器计算符合  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值