欢迎来到.net学习网

欢迎联系站长一起更新本网站!QQ:879621940

您当前所在位置:首页 » ASP.Net » 正文

热门阅读

DataTable.Compute强大的功能

创建时间:2011年05月30日 14:55  阅读次数:(6125)
分享到:

以前还真没想到DataTable.Compute具有这么多的功能
1:聚合函数”Sum()”

2:自由计算表达式“20*30+1”

3:bool表达式“1=2”

4:IFF逻辑表达式” IIF(20>1000, 0, 1)” //还支持IsNull,Trim,SubString等

一个小应用:让DataTable模拟Excel的Formula功能。

Excel中的Formula功能强大,如果能让DataTable有类似的功能就好了。大部分事件DataTable只是用作数据载体,其实很少用它做计算。DataTable提供的函数Compute就提供了功能强大的计算功能。

Compute函数的参数就两个:Expression,和Filter。

Expresstion是计算表达式,关于Expression的详细内容请看这里“http://msdn2.microsoft.com/zh-cn/library/system.data.datacolumn.expression(VS.80).aspx”。而Filter则是条件过滤器,类似sql的Where条件。

1: 这里详细介绍的就是Expresstion。

先看最简单的用法,使用聚合函数。这个聚合函数就是报表或者Excel中常用的函数,比如Sum,Avg等等。对于数据列,Datatable可以方便的进行计算,比如DataTable.Cumpute(“Sum(列1)”,”列1>0”); 对于简单的统计功能,这些函数就足够用了。(其他提供的函数有min,max,count,求方差,标准偏差等等)。这个功能常用,倒也不奇怪。

再看“自由表达式”计算。把数学计算表达式写成字符串,然后直接投入Compute函数计算,就可以得到计算结果。这样,动态生成的计算表达式就可以计算出来了。比方说要计算“列1×30+20+2”或者是纯粹的数学计算。

出了计算出具体的结果,Compute函数还能进行逻辑计算。比方说这个表达式就能返回false:Compute(“1=2”,”true”); 这个的用法可能想上边的情形差不多,在自由组装一些条件的时候可以得到结果。

在Excel中,还经常用到的就是LogicTest功能了,可以指定一些逻辑表达式,比如这样的:“IF(20>1000, 0, 1)”。而这个功能要是放到DataTable中该如何实现呢?也是用Compute,这样写就可以了:“IIF(20>1000, 0, 1)”。

在DataTable里面如果实现“IF(C102=0,0,C105/C102*30)”就用上边的这些技术点就可以了。

2:至于第二个参数Filter,就是一个简单的查询条件。比如,”true”, “Id>4”, “Name like ’%nd’ and sex=’male’”.

条件不可能很复杂,这些已经比较够用了。

以前用过的Marge什么的也不错,还可以作内连接,在数据量小,需要简单计算的情况下,这些功能很有用。

当然,如果逻辑极其复杂,DT的这点功能就不够了,还是得自己写逻辑(即使要实现“IF(C102=0,0,C105/C102*30)”,也是要自己写一点处理逻辑的,不过比较通用,写一次就好了)。

----------------------------------

DataTable.Compute 方法 
计算用来传递筛选条件的当前行上的给定表达式

public Object Compute (     string expression,     string filter )
实例:
        string sConnectionString; //声明一个字符串
        //连接数据库字符串,连接到XBMIS数据库,用户名是sa
        sConnectionString = " Data Source=.;Initial Catalog=XBMIS;User ID=sa; ";
        //创建SqlConnection数据库连接对象
        SqlConnection Conn = new SqlConnection(sConnectionString);
        //打开Conn
        Conn.Open();
        //sql语句把T_YongH表中的数据信息都取出来
        string commandString = "Select BianH AS 编号,ZhuCYHM AS 注册名,XingM AS 姓名,XingB AS 性别 From T_YongH";
        SqlDataAdapter dataAdapter = new SqlDataAdapter(commandString, Conn);
        ds_datatable ds = new ds_datatable();
        //填充数据集
        dataAdapter.Fill(ds, "YongH");
        //填充数据表
        DataTable dataTable = ds.Tables["YongH"];
        //创建一个新行并添加到dataTable数据表中
        DataRow dataRow;
        dataRow = dataTable.NewRow();
        //使用Sum含数计算编号的总和,使用Count函数计算编号的个数
        dataRow[0] = dataTable.Compute("Sum(编号)", "true");
        dataRow[1] = dataTable.Compute("Count(编号)", "");
        //把数据行添加到YongHTable数据表中
        dataTable.Rows.Add(dataRow);
        GridView1.DataSource = dataTable;
        GridView1.DataBind();

参数说明:

expression 参数需要聚合函数,要计算的表达式字符串,基本上类似于Sql Server中的统计表达式。例如,以下是合法表达式:Count(ID)。

filter:统计的过滤字符串,只有满足这个过滤条件的记录才会被统计,也就是确定在表达式中使用哪些行。

来源:http://blog.sina.com.cn/s/blog_3f8fae530100cc7g.html
说明:所有来源为 .net学习网的文章均为原创,如有转载,请在转载处标注本页地址,谢谢!
【编辑:Wyf

打赏

取消

感谢您的支持,我会做的更好!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

最新评论

共有评论0条
  • 暂无任何评论,请留下您对本文章的看法,共同参入讨论!
发表评论:
留言人:
内  容:
请输入问题 30+32=? 的结果(结果是:62)
结  果: