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 DataTable();//嵌套的三元运算 牛叉到五体投地object obj = dt.Compute("iif(1000=5,1000,iif(100>100,4001,2000))", null);Response.Write(obj);System.Data.DataTable table = new DataTable();//计算常量,可以没有初始化列object test = table.Compute("1+1", "");Console.WriteLine(test);string a = "123";System.Double b = 123;decimal c = 123m;Console.WriteLine(Convert.ToDecimal(a));//test=2;
test = table.Compute("1+1", "false");Console.WriteLine(test);//test=2;常数计算和filter无关
test = table.Compute("abs(1)", "");Console.WriteLine(test);//test=null,不知道为这个什么没有报错,而且返回null,其他的数学函数都会抱错
test = table.Compute("2%2", "");Console.WriteLine(test);//test=0;//其他函数参考下面的计算列//初始化datataletable.Columns.Add("id", typeof(string));table.Columns.Add("value", typeof(int));for (int i = 1; i <= 10; i++){System.Data.DataRow dRow = table.NewRow();dRow["id"] = "id" + i.ToString();dRow["value"] = i;table.Rows.Add(dRow);}//test = table.Compute("value+1", "true");/**/////抛出异常,这里必须是聚合函数//*************************************支持的聚合函数**********************////求数量test = table.Compute("count(id)", "false");Console.WriteLine(test);//test=0;
test = table.Compute("count(id)", "true");Console.WriteLine(test);//test=10;//求和test = table.Compute("sum(value)", "");Console.WriteLine(test);//test=55;//test = table.Compute("sum(id)","");/**/////抛出异常,这里不能是string//平均test = table.Compute("avg(value)", "");Console.WriteLine(test);//test=5;//最小test = table.Compute("min(value)", "");Console.WriteLine(test);//test=1;//最大test = table.Compute("max(value)", "");Console.WriteLine(test);//test=10;//统计标准偏差test = table.Compute("StDev(value)", "");Console.WriteLine(test);//test=3.02765035409749//统计方差test = table.Compute("Var(value)", "");Console.WriteLine(test);//test=9.16666666666667//复杂计算test = table.Compute("max(value)/sum(value)", "");Console.WriteLine(test);//test=0.181818181818182/**//*******************************************计算列*************************/System.Data.DataColumn column = new DataColumn("exp1", typeof(float));table.Columns.Add(column);//简单计算column.Expression = "value*2";test = table.Select("id='id1'")[0]["exp1"];Console.WriteLine(test);//test=2;//字符串函数column.Expression = "len(id)";test = table.Select("id='id1'")[0]["exp1"];Console.WriteLine(test);//test=3;//字符串函数column.Expression = "len(' '+id+' ')";test = table.Select("id='id1'")[0]["exp1"];Console.WriteLine(test);//test=5;//字符串函数column.Expression = "len(trim(' '+id+' '))";test = table.Select("id='id1'")[0]["exp1"];Console.WriteLine(test);//test=3;//字符串函数column.Expression = "substring(id,3,len(id)-2)";test = table.Select("id='id1'")[0]["exp1"];Console.WriteLine(test);//test=1; //substring的起始字符位置为1不是0//类型转换column.Expression = "convert(substring(id,3,len(id)-2),'System.Int32')*1.6";test = table.Select("id='id1'")[0]["exp1"];Console.WriteLine(test);//test=1.6;//相当于sqlserver的isnullcolumn.Expression = "isnull(value,10)";test = table.Select("id='id1'")[0]["exp1"];Console.WriteLine(test);//test=1;//三元运算符,相当于sqlserver的case whencolumn.Expression = "iif(value>5,1000,2000)";test = table.Select("id='id1'")[0]["exp1"];Console.WriteLine(test);//test=2000;//like运算符column.Expression = "iif(id like '%1',1000,2000)";test = table.Select("id='id1'")[0]["exp1"];Console.WriteLine(test);//test=1000;//in运算符column.Expression = "iif(id not in('id1'),1000,2000)";test = table.Select("id='id1'")[0]["exp1"];Console.WriteLine(test);//test=2000;//嵌套的三元运算column.Expression = "iif(value>5,1000,iif(id like '%1',4000,2000))";test = table.Select("id='id1'")[0]["exp1"];Console.WriteLine(test);//test=4000;//客户端计算所占总数的百分比column.Expression = "value/sum(value)";test = table.Select("id='id1'")[0]["exp1"];Console.WriteLine(test);//test=0.01818182//客户端计算差值,比如nba常规赛的胜场差column.Expression = "max(value)-value";test = table.Select("id='id1'")[0]["exp1"];Console.WriteLine(test);//test=9//***********************父子表计算*************************************///初始化子表,父子表关系DataTable tableChild = new DataTable();tableChild.Columns.Add("id", typeof(string));tableChild.Columns.Add("value", typeof(int));System.Data.DataSet ds = new DataSet();ds.Tables.Add(tableChild);ds.Tables.Add(table);DataRelation relation = new DataRelation("relation", table.Columns["id"], tableChild.Columns["id"]);ds.Relations.Add(relation);for (int i = 1; i <= 10; i++){System.Data.DataRow dRow = tableChild.NewRow();dRow["id"] = "id1";dRow["value"] = i;tableChild.Rows.Add(dRow);}//计算子表记录数column.Expression = "count(child(relation).value)";test = table.Select("id='id1'")[0]["exp1"];Console.WriteLine(test);//test=10;//计算父子表的百分比column.Expression = "value/sum(child(relation).value)";test = table.Select("id='id1'")[0]["exp1"];Console.WriteLine(test);//test=0.01818182;//计算父子表的差值,比如父表为库存数量,子表为订购数量,计算得出需要补充的数量column.Expression = "iif(value-sum(child(relation).value)>0,0,value-sum(child(relation).value))";test = table.Select("id='id1'")[0]["exp1"];Console.WriteLine(test);//test=-54;//比较遗憾的是没有发现能够计算同比和环比的方法,而且计算列无法作为约束//结束,DataTable可以让你尽量发挥聪明才智来减少繁杂的sql语句并且减轻服务器计算符合

转载于:https://www.cnblogs.com/wolfocme110/p/4897737.html

C#中DataTable中的Compute方法使用收集相关推荐

  1. 关于在DataTable中执行DataTable.Select(条件)返回DataTable的解决方法

    在实际编程工程中,常常遇到这样的情况:DataTable并不是数据库中的,或者DataTable尚未写到数据库,或者从数据库中读出的DataTable已经在本地被改动,又没有写回数据库(可能还要作其他 ...

  2. 比较2个DataTable中的内容是否相同的方法

    DataTable可以通过RowStatus来判断状态是否发生了改变.但是有些时候我们希望在行状态即使为Modified的情况下也不要提示内容发生了变化,这个时候我们可能就需要自己写方法去判断了.比如 ...

  3. c html转为datatable,C#中DataTable导出为HTML格式的方法

    前言 在C#中DataTable导出数据的时候,我们需要HTML格式的输出数据, 这时候就需要使用将DataTable导出为到HTML格式的方法了,以下代码就可以帮助我们达到目的. 首先,我们要绑定D ...

  4. [datatable]关于在DataTable中执行DataTable.Select(“条件“)返回DataTable的解决方法

    [datatable]关于在DataTable中执行DataTable.Select("条件")返回DataTable的解决方法 参考文章: (1)[datatable]关于在Da ...

  5. DataTable中数据记录的统计

    DataTable中数据记录的统计 我们在使用Sql Server这些数据库时,可以轻松的通过Sum.Aver.Count等统计出相关结果,那么,在已经把数据检索出来的DataSet(DataTabl ...

  6. DataTable 中各种计算(笔记)

    在DataTable 中可能会涉及到各种各样的计算,其实我们可以使用DataTable.Compute方法 public Object Compute(string expression,string ...

  7. C# DataTable Compute方法的使用

    在开发中需要对DataTable的数据进行处理,比如累加,求最大最小及平均值等,以前都采用手工对DataTable进行循环并计算的方式,现在发现DataTable的Compute方法可以轻松实现这些功 ...

  8. 在DataTable中更新、删除数据

    在DataTable中选择记录 /*在DataTable中选择记录*//* 向DataTable中插入记录如上,更新和删除如下:* ----但是在更新和删除前,首先要找出要更新和删除的记录.* 一种方 ...

  9. 向DataTable中添加自定义的行

    [标题]向DataTable中添加自定义行 [内容] 向DataTable中添加自定义行,然后绑定到DropDownList控件中,并且默认行为控件的第一行 如果表结构如下:              ...

最新文章

  1. Eclipse 无限编译Invoking 'Maven Project Builder'导致卡主
  2. 成功解决building ‘snappy._snappy‘ extension error: Microsoft Visual C++ 14.0 is required. Get it with “B
  3. NGINX最新API管理模块已可用,针对内部和外部API进行了优化
  4. 并发环境下,先操作数据库还是先操作缓存?
  5. 七:构造方法与自定义构造方法
  6. 佳能fax_l150如何打印_佳能faxl150说明书下载
  7. MyEclipse汉化后问题
  8. FILEUTILS 介绍
  9. 线性表的顺序存储结构和链式存储结构的比较
  10. 袁玉玮:简介人工智能在基金界的应用现状 (二)卖方交易员被冲击
  11. office2010c盘_安装office2010一半时取消导致C盘空间少了将近8个G,卸载office后C盘内存没有变回来,有谁知道怎么办吗?...
  12. Xilinx:词汇表
  13. 未来教育计算机二级第十八套ppt,未来教育.ppt
  14. 平流方程基于MATLAB数值解法,Matlab微分方程高效解法:谱方法原理与实现
  15. R语言--异常值检测
  16. SSM项目实战之二十五:新增订单
  17. windows powershell激活anaconda虚拟环境
  18. 三星支付存在漏洞可导致黑客进行交易劫持
  19. 控制浏览器窗口的可以缩放的最小高度和宽度
  20. 最长递增子序列O(NlogN)算法

热门文章

  1. c++ 数字后加f_c.4 计算摄氏温度
  2. Linux 文件系统初探
  3. CF--思维练习--CodeForces - 220C Little Elephant and Shifts (STL模拟)
  4. 数学--数论--HDU1825(积性函数性质+和函数公式+快速模幂+非互质求逆元)
  5. 隐含马尔可夫模型在语言处理中的应用(Z)
  6. Microwindows及基于Nano-X的简单程序开发
  7. float,double等精度丢失问题
  8. 国际人工智能算法与应用研讨会(WASA 2018)参会笔记
  9. 通过 Service 访问 Pod - 每天5分钟玩转 Docker 容器技术(136)
  10. 人民的名义中,为什么蔡成功的贷款这么难?