原文: 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);

        ";
        System.Double b = ;
        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;
        //其他函数参考下面的计算列

        //初始化datatale
        table.Columns.Add("id", typeof(string));
        table.Columns.Add("value", typeof(int));
        ; i <= ; 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(]["exp1"];
        Console.WriteLine(test);
        //test=2;

        //字符串函数
        column.Expression = "len(id)";
        test = table.Select(]["exp1"];
        Console.WriteLine(test);
        //test=3;

        //字符串函数
        column.Expression = "len(' '+id+' ')";
        test = table.Select(]["exp1"];
        Console.WriteLine(test);
        //test=5;

        //字符串函数
        column.Expression = "len(trim(' '+id+' '))";
        test = table.Select(]["exp1"];
        Console.WriteLine(test);
        //test=3;

        //字符串函数
        column.Expression = "substring(id,3,len(id)-2)";
        test = table.Select(]["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(]["exp1"];
        Console.WriteLine(test);
        //test=1.6;

        //相当于sqlserver的isnull
        column.Expression = "isnull(value,10)";
        test = table.Select(]["exp1"];
        Console.WriteLine(test);
        //test=1;

        //三元运算符,相当于sqlserver的case when
        column.Expression = "iif(value>5,1000,2000)";
        test = table.Select(]["exp1"];
        Console.WriteLine(test);
        //test=2000;

        //like运算符
        column.Expression = "iif(id like '%1',1000,2000)";
        test = table.Select(]["exp1"];
        Console.WriteLine(test);
        //test=1000;

        //in运算符
        column.Expression = "iif(id not in('id1'),1000,2000)";
        test = table.Select(]["exp1"];
        Console.WriteLine(test);
        //test=2000;

        //嵌套的三元运算
        column.Expression = "iif(value>5,1000,iif(id like '%1',4000,2000))";
        test = table.Select(]["exp1"];
        Console.WriteLine(test);
        //test=4000;

        //客户端计算所占总数的百分比
        column.Expression = "value/sum(value)";
        test = table.Select(]["exp1"];
        Console.WriteLine(test);
        //test=0.01818182

        //客户端计算差值,比如nba常规赛的胜场差
        column.Expression = "max(value)-value";
        test = table.Select(]["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);

        ; i <= ; 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(]["exp1"];
        Console.WriteLine(test);
        //test=10;

        //计算父子表的百分比
        column.Expression = "value/sum(child(relation).value)";
        test = table.Select(]["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(]["exp1"];
        Console.WriteLine(test);
        //test=-54;

        //比较遗憾的是没有发现能够计算同比和环比的方法,而且计算列无法作为约束
        //结束,DataTable可以让你尽量发挥聪明才智来减少繁杂的sql语句并且减轻服务器计算符合

C#中DataTable中的Compute方法使用收集的更多相关文章

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

    最近参加项目中,数据操作基本都是用DataTable的操作,老代码中有些地方用到DataTable.Rows.Add又有些代码用的DataTable.ImportRow,于是就对比了一下 VS查询说明 ...

  2. C# 中dataTable中的数据批量增加至数据表中

    /// <summary> /// 批量添加 /// </summary> /// <param name="dt"></param> ...

  3. C#把DataTable中数据一次插入数据库的方法

    现在实际的情况是这样的: 客户有一台打卡机,员工打卡的信息全部储存在打卡机的Access数据库里面,现在客户引入了一种新的管理系统,需要将Access数据库中的打卡数据同步到SQL Server数据库 ...

  4. SELECT INTO和INSERT INTO SELECT的区别 类似aaa?a=1&amp;b=2&amp;c=3&amp;d=4,如何将问号以后的数据变为键值对 C# 获取一定区间的随即数 0、1两个值除随机数以外的取值方法(0、1两个值被取值的概率相等) C# MD5 加密,解密 C#中DataTable删除多条数据

    SELECT INTO和INSERT INTO SELECT的区别   数据库中的数据复制备份 SELECT INTO: 形式: SELECT value1,value2,value3 INTO Ta ...

  5. [datatable]关于在DataTable中执行DataTable.Select(&quot;条件&quot;)返回DataTable的解决方法

    -- :09关于在DataTable中执行DataTable.Select("条件")返回DataTable的解决方法 在实际编程工程中,常常遇到这样的情况:DataTable并不 ...

  6. DataTable中执行DataTable.Select(&quot;条件&quot;),

    我们在使用Sql ******这些数据库时,可以轻松的通过Sum.Aver.Count等统计出相关结果,那么,在已经把数据检索出来的DataSet(DataTable)中呢?特别是通过Web Serv ...

  7. [datatable]借助DataTable的Compute方法

    借助DataTable的Compute方法,DataTable中数据不用事先排好序. 下面代码中的dt是跟前面的是一样的 DataTable dtName = dt.DefaultView.ToTab ...

  8. C# DataTable Compute方法的使用

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

  9. 关于c#在DataTable中根据条件删除某一行

    我们经常会将数据源放在DataTable里面,但是有时候也需要移除不想要的行,下面的代码告诉你们 DataTable dts:                DataRow[] foundRow;   ...

随机推荐

  1. 初学后台框架总结篇二——快速了解CI框架

    一.下载CI框架并安装,这里放置一张自己的项目目录结构图 目录框架搭建好之后开始将自己的项目与框架融合 二.更改相关配置 1.用任何文本编辑器打开 application/config/config. ...

  2. IOS中CoreData浅析

    CoreData简介: 什么是CoreData? Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中, ...

  3. oracle定时任务

    一.简介 当我们需要oracle数据库定时自动执行一些脚本,或进行数据库备份.数据库的性能优化,包括重建索引等工作是需要使用到定时任务. 定时任务可以使用以下两种完成. 1.操作系统级的定时任务,wi ...

  4. Thinkphp3.2.2的上传问题

    学习了Thinkphp3.2.2的上传,报出了FILE: F:\development\yxk\Cord\Library\Think\Upload.class.php LINE: 257错误 这应该是 ...

  5. Scala学习文档-样本类与模式匹配(match,case,Option)

    样本类:添加了case的类便是样本类.这种修饰符可以让Scala编译器自动为这个类添加一些语法上的便捷设定. //样本类case class //层级包括一个抽象基类Expr和四个子类,每个代表一种表 ...

  6. tmux 配置

    tmux配置文件名为.tmux.conf,位于用户根目录下. 常用的配置为: # vimsetw -g mode-keys vibind [ copy-modebind -t vi-copy v be ...

  7. sharpSVN说明文档

    http://sharpsvn.open.collab.net/docs/walkthrough.htm

  8. 转:MAVEN依赖的是本地工程还是仓库JAR包?

    相信大家都碰见过 maven 配置的依赖或者是 jar 包或者是工程,在开发的过程当中,我们当然需要引入的是工程,这样查看 maven 依赖的文件的时候,就能直接查看到源码. 一.本地工程依赖 举个例 ...

  9. 【转】asp.net基础-HttpModule

    HttpModule是向实现类提供模块初始化和处置事件.当一个HTTP请求到达HttpModule时,整个ASP.NET Framework系统还并没有对这个HTTP请求做任何处理,也就是说此时对于H ...

  10. Linux环境安装PostgreSQL-10.1

    转载自:https://www.cnblogs.com/LinBug/p/8082790.html Linux环境安装PostgreSQL-10.1   环境及资源 Linux版本:CentOS re ...