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

<转> C#中DataTable中的Compute方法使用收集的相关文章

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条件. DataTable dt = new DataT

C#中DataTable中Rows.Add 和 ImportRow 对比

最近参加项目中,数据操作基本都是用DataTable的操作,老代码中有些地方用到DataTable.Rows.Add又有些代码用的DataTable.ImportRow,于是就对比了一下 VS查询说明:显示 // // 摘要: // 创建使用指定值的行,并将其添加到 System.Data.DataRowCollection 中. // // 参数: // values: // 用于创建新行的值的数组. // // 返回结果: // 无. // // 异常: // System.Argument

C#中删除DataTable中的行的方法

1.在C#中,如果要删除DataTable中的某一行,大约有以下几种办法: •使用DataTable.Rows.Remove(DataRow),或者DataTable.Rows.RemoveAt(index):可以直接删除行•datatable.Rows[i].Delete().Delete()之后需要datatable.AccepteChanges()方法确认完全删除,因为Delete()只是将相应列的状态标志为删除,还可以通过datatable.RejectChanges()回滚,使该行取消

C#中datatable导出excel(三种方法)

方法一:(拷贝直接可以使用,适合大批量资料, 上万笔)Microsoft.Office.Interop.Excel.Application appexcel = new Microsoft.Office.Interop.Excel.Application();SaveFileDialog savefiledialog = new SaveFileDialog();System.Reflection.Missing miss = System.Reflection.Missing.Value;ap

C#中datatable去重的方法

这篇文章主要介绍了C#中datatable去重的方法,通过两种不同的方法对比分析了datatable去重的技巧,非常具有实用价值,需要的朋友可以参考下 这里主要介绍两种方法: 1  数据库直接去除重复 select  distinct * from 表名 2 对 DataTable直接进行操作 DataTable dt=db.GetDt("select * from 表名");//获得datatable DataView dv = new DataView(dt);//虚拟视图吧,我这

一些常用的方法(1)--去除DataTable中的重复数据

private DataTable Display(DataTable dtSource)        {            DataTable dtTemp = dtSource.Copy();            foreach (DataRow dr in dtSource.Rows)            {                DataRow[] drRepeat = dtTemp.Select("AA='" + dr["AA"].ToS

C# DataTable.DefaultView.Sort 排序方法 DataTable合并 DataTable中Merge属性的用法

排序 DataTable.DefaultView.Sort ="ID ASC"" DataTable进行合并1(必须相同结构DataTable)  DataTable中Merge属性 两个DataTable进行合并,最初测试使用DataTable的Merge方法直接合并读取,一个是两边接收的数据类型有很多不致,一个是感觉这个太简单了.所以在程序总报类型错误的时,我舍弃了这种方法取而代之的是从两个DataTable里面读值分别进行判断显示. DataTable  oldData

C#中DataTable删除行的方法分析

本文实例讲述了C#中DataTable删除行的方法,分享给大家供大家参考之用.具体实现方法如下: 自己的删除例子(drTemp是表,gvSummary是dev 的gridview.单击右键点击grid删除): 1.dtTemp.Rows.RemoveAt(gvSummary.FocusedRowHandle); 2.dtTemp.Rows[gvSummary.FocusedRowHandle].Delete();  dtTemp.AcceptChanges(); 在C#中,如果要删除DataTa

C# DataTable中返回列中的最大值

此处以表dt2中的keyIndex列(int类型)为例 1.通过linq来实现 int maxKeyIndex = dt2.AsEnumerable().Select(t => t.Field<int>("keyIndex")).Max(); Linq语法:点击打开链接2.通过Compute方法来实现 int ee = (int)dt2.Compute("Max(keyIndex)", "true"); Compute方法:点击