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 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方法使用收集相关推荐
- 关于在DataTable中执行DataTable.Select(条件)返回DataTable的解决方法
在实际编程工程中,常常遇到这样的情况:DataTable并不是数据库中的,或者DataTable尚未写到数据库,或者从数据库中读出的DataTable已经在本地被改动,又没有写回数据库(可能还要作其他 ...
- 比较2个DataTable中的内容是否相同的方法
DataTable可以通过RowStatus来判断状态是否发生了改变.但是有些时候我们希望在行状态即使为Modified的情况下也不要提示内容发生了变化,这个时候我们可能就需要自己写方法去判断了.比如 ...
- c html转为datatable,C#中DataTable导出为HTML格式的方法
前言 在C#中DataTable导出数据的时候,我们需要HTML格式的输出数据, 这时候就需要使用将DataTable导出为到HTML格式的方法了,以下代码就可以帮助我们达到目的. 首先,我们要绑定D ...
- [datatable]关于在DataTable中执行DataTable.Select(“条件“)返回DataTable的解决方法
[datatable]关于在DataTable中执行DataTable.Select("条件")返回DataTable的解决方法 参考文章: (1)[datatable]关于在Da ...
- DataTable中数据记录的统计
DataTable中数据记录的统计 我们在使用Sql Server这些数据库时,可以轻松的通过Sum.Aver.Count等统计出相关结果,那么,在已经把数据检索出来的DataSet(DataTabl ...
- DataTable 中各种计算(笔记)
在DataTable 中可能会涉及到各种各样的计算,其实我们可以使用DataTable.Compute方法 public Object Compute(string expression,string ...
- C# DataTable Compute方法的使用
在开发中需要对DataTable的数据进行处理,比如累加,求最大最小及平均值等,以前都采用手工对DataTable进行循环并计算的方式,现在发现DataTable的Compute方法可以轻松实现这些功 ...
- 在DataTable中更新、删除数据
在DataTable中选择记录 /*在DataTable中选择记录*//* 向DataTable中插入记录如上,更新和删除如下:* ----但是在更新和删除前,首先要找出要更新和删除的记录.* 一种方 ...
- 向DataTable中添加自定义的行
[标题]向DataTable中添加自定义行 [内容] 向DataTable中添加自定义行,然后绑定到DropDownList控件中,并且默认行为控件的第一行 如果表结构如下: ...
最新文章
- Eclipse 无限编译Invoking 'Maven Project Builder'导致卡主
- 成功解决building ‘snappy._snappy‘ extension error: Microsoft Visual C++ 14.0 is required. Get it with “B
- NGINX最新API管理模块已可用,针对内部和外部API进行了优化
- 并发环境下,先操作数据库还是先操作缓存?
- 七:构造方法与自定义构造方法
- 佳能fax_l150如何打印_佳能faxl150说明书下载
- MyEclipse汉化后问题
- FILEUTILS 介绍
- 线性表的顺序存储结构和链式存储结构的比较
- 袁玉玮:简介人工智能在基金界的应用现状 (二)卖方交易员被冲击
- office2010c盘_安装office2010一半时取消导致C盘空间少了将近8个G,卸载office后C盘内存没有变回来,有谁知道怎么办吗?...
- Xilinx:词汇表
- 未来教育计算机二级第十八套ppt,未来教育.ppt
- 平流方程基于MATLAB数值解法,Matlab微分方程高效解法:谱方法原理与实现
- R语言--异常值检测
- SSM项目实战之二十五:新增订单
- windows powershell激活anaconda虚拟环境
- 三星支付存在漏洞可导致黑客进行交易劫持
- 控制浏览器窗口的可以缩放的最小高度和宽度
- 最长递增子序列O(NlogN)算法
热门文章
- c++ 数字后加f_c.4 计算摄氏温度
- Linux 文件系统初探
- CF--思维练习--CodeForces - 220C Little Elephant and Shifts (STL模拟)
- 数学--数论--HDU1825(积性函数性质+和函数公式+快速模幂+非互质求逆元)
- 隐含马尔可夫模型在语言处理中的应用(Z)
- Microwindows及基于Nano-X的简单程序开发
- float,double等精度丢失问题
- 国际人工智能算法与应用研讨会(WASA 2018)参会笔记
- 通过 Service 访问 Pod - 每天5分钟玩转 Docker 容器技术(136)
- 人民的名义中,为什么蔡成功的贷款这么难?