原文: 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 = "";
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));
for (int i = ; 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("id='id1'")[]["exp1"];
Console.WriteLine(test);
//test=2; //字符串函数
column.Expression = "len(id)";
test = table.Select("id='id1'")[]["exp1"];
Console.WriteLine(test);
//test=3; //字符串函数
column.Expression = "len(' '+id+' ')";
test = table.Select("id='id1'")[]["exp1"];
Console.WriteLine(test);
//test=5; //字符串函数
column.Expression = "len(trim(' '+id+' '))";
test = table.Select("id='id1'")[]["exp1"];
Console.WriteLine(test);
//test=3; //字符串函数
column.Expression = "substring(id,3,len(id)-2)";
test = table.Select("id='id1'")[]["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'")[]["exp1"];
Console.WriteLine(test);
//test=1.6; //相当于sqlserver的isnull
column.Expression = "isnull(value,10)";
test = table.Select("id='id1'")[]["exp1"];
Console.WriteLine(test);
//test=1; //三元运算符,相当于sqlserver的case when
column.Expression = "iif(value>5,1000,2000)";
test = table.Select("id='id1'")[]["exp1"];
Console.WriteLine(test);
//test=2000; //like运算符
column.Expression = "iif(id like '%1',1000,2000)";
test = table.Select("id='id1'")[]["exp1"];
Console.WriteLine(test);
//test=1000; //in运算符
column.Expression = "iif(id not in('id1'),1000,2000)";
test = table.Select("id='id1'")[]["exp1"];
Console.WriteLine(test);
//test=2000; //嵌套的三元运算
column.Expression = "iif(value>5,1000,iif(id like '%1',4000,2000))";
test = table.Select("id='id1'")[]["exp1"];
Console.WriteLine(test);
//test=4000; //客户端计算所占总数的百分比
column.Expression = "value/sum(value)";
test = table.Select("id='id1'")[]["exp1"];
Console.WriteLine(test);
//test=0.01818182 //客户端计算差值,比如nba常规赛的胜场差
column.Expression = "max(value)-value";
test = table.Select("id='id1'")[]["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 = ; 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("id='id1'")[]["exp1"];
Console.WriteLine(test);
//test=10; //计算父子表的百分比
column.Expression = "value/sum(child(relation).value)";
test = table.Select("id='id1'")[]["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'")[]["exp1"];
Console.WriteLine(test);
//test=-54; //比较遗憾的是没有发现能够计算同比和环比的方法,而且计算列无法作为约束
//结束,DataTable可以让你尽量发挥聪明才智来减少繁杂的sql语句并且减轻服务器计算符合

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

  1. 转载 C#中DataTable中的Compute方法使用收集

    原文: C#中DataTable中的Compute方法使用收集 Compute函数的参数就两个:Expression,和Filter. Expresstion是计算表达式,关于Expression的详 ...

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

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

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

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

  4. c# 基于DataTable的Compute方法的扩展

    DataTable.Compute(String, String) 方法 定义 命名空间:System.Data 程序集:System.Data.dll, netstandard.dll, Syste ...

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

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

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

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

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

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

  8. 【转载】C#通过IndexOf方法获取某一列在DataTable中的索引位置

    在C#中的Datatable数据变量的操作过程中,有时候需要知道某一个列名在DataTable中的索引位置信息,此时可以通过DataTable变量的Columns属性来获取到所有的列信息,然后通过Co ...

  9. 【转载】C#通过Contains方法判断DataTable中是否存在某个列名

    在C#中的Datatable数据变量的操作过程中,有时候需要判断DataTable中是否存在某个列名,此时可以通过DataTable对象的Columns列对象集合属性下的Contains方法来进行判断 ...

随机推荐

  1. SQL优化技术分析-4:其他

    ORACLE的提示功能是比较强的功能,也是比较复杂的应用,并且提示只是给ORACLE执行的一个建议,有时如果 出于成本方面的考虑ORACLE也可能不会按提示进行.根据实践应用,一般不建议开发人员应用O ...

  2. Mysql的Haproxy反向代理和负载均衡

    HaProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案.应用到Haproxy主要是因为他免费,并且基于TCP和HTTP的应用代理. ...

  3. rhel7 单用户修改root密码

    rhel7密码忘记的时候,可以通过单用户模式修改密码 1.修改 引导文件,添加rw init=/sysroot/bin/sh ,ctrl+x启动 2.切换根chroot /sysroot3.使用pas ...

  4. User mode Linux

    一.简介 用户模式Linux(User ModeLinux,UML)不同于其他Linux虚拟化项目,UML尽量将它自己作为一个普通的程序.从Linux2.6.9版本起,用户模式Linux(User m ...

  5. sql select 1-10的数字

    SELECT V FROM (   VALUES (1), (2), (3), (4), (5),          (6), (7), (8), (9), (10) ) [1 to 10](V)

  6. transactionManager 以及datasource type解析

    transactionManager 在 MyBatis 中有两种事务管理器类型(也就是 type=”[JDBC|MANAGED]”): JDBC – 这个配置直接简单使用了 JDBC 的提交和回滚设 ...

  7. 内网劫持渗透新姿势:MITMf简要指南

    声明:本文具有一定攻击性,仅作为技术交流和安全教学之用,不要用在除了搭建环境之外的环境. 0×01 题记 又是一年十月一,想到小伙伴们都纷纷出门旅游,皆有美酒佳人相伴,想到这里,不禁潸然泪下.子曰:& ...

  8. webgl巧妙方式写着色器代码

    var VSHADER_SOURCE = function(){ /* void main(){ gl_Position = vec4(0.0,0.0,0.0,1.0); gl_PointSize = ...

  9. Go语言开发第一个Hello,World

    在网上看到go语言的各种评价,也是闻名已久,但是没有自己实践过,也不知道它的好,它的坏,今天就来试试第一个小程序 第一步.如何下载 1)下载go安装程序 下载地址:https://golang.org ...

  10. vue-resource初体验

    这个插件是用于http请求的,类似于jquery的ajax函数,支持多种http方法和jsonp. 下面是resource支持的http方法. get: {method: 'GET'},save: { ...