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

來源:互聯網
上載者:User

標籤:style   blog   http   io   color   ar   os   使用   sp   

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方法使用收集

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.