DataTable.Compute()用法

2010-04-07 11:28
一、DataTable.Compute()方法說明如下

作用:
          计算用来传递筛选条件的当前行上的给定表达式。 
格式為:
          Object Compute (string expression,string filter)

参数:
          expression:要计算的表达式。 expression 参数需要聚合函数。
          filter:要限制在表达式中进行计算的行的筛选器。 如:“Menu_ID=5” //表示Menu_ID為5的行
返回值:
          為Object型,为计算结果。

Expression說明:
          Expression 属性的一个用途是创建计算出的列。 第二个用途是创建聚合列。类似于计算出的值,聚合基于 DataTable 中的整个行集执行操作。

表达式语法
          在创建表达式时,使用 ColumnName属性(表中列的名稱)来引用表中的列。
用法:

//得到menu1表中order列中最大值
            object s = dsSet.Tables["menu1"].Compute("Max(order)", ""); 

二、創建Expression說明:

2.1、在为筛选器创建表达式时,用单引号将字符串括起来:

         "LastName = 'Jones'" 

2.1.1特殊字符處理:
              下面的字符是特殊字符,如下面所解释的,如果它们用于列名称中,就必须进行转义。

"n (newline)

"t (tab)

"r (carriage return)

~

(

)

#

"

/

=

>

<

+

-

*

%

&

|

^

'

"

[

]

2.1.2 轉義方法為:
              如果列名称包含上面的字符之一,该名称必须用中括号括起来。例如,若要在表达式中使用名为“Column#”的列,应写成“[Column#]”:

              Total * [Column#] 

由于中括号是特殊字符,如果它是列名称的组成部分,必须使用斜杠 (""") 将中括号转义。例如,名为“Column[]”的列应写成:

              Total * [Column["]] (只有第二个中括号必须转义。) 

2.2、用户定义的值處理
        2.2.1义的值可以用在将与列值进行比较的表达式内。字符串的值应括在单引号内。日期值应放在磅符号 (#) 内。对于数值,允许使用小数和科学记数法。例如:

             "FirstName = 'John'"
             "Price <= 50.00"
             "Birthdate < #1/31/82#" 

2.2.2含枚举值的列,将值强制转换为整数数据类型。例如:

             "EnumColumn = 5" 

2.3、运算符
         2.3.1 使用布尔值 AND、OR 和 NOT 运算符时允许串联。可以使用括号来组合子句和强制优先级。AND 运算符优先于其他运算符。例如:

              (LastName ='Smith' OR LastName ='Jones') AND FirstName ='John' 

2.3.2 在创建比较表达式时,允许使用下列运算符:

<

>

<=

>=

<>

=

IN

LIKE

2.3.3 在表达式中还支持下列算术运算符:

+(加)

-(减)

*(乘)

/(除)

%(模数)

2.4、字符串运算符處理
         若要连接字符串,请使用 + 字符。DataSet 类的 CaseSensitive 属性的值确定字符串比较是否区分大小写。但是,可以用 DataTable 类的 CaseSensitive 属性重写该值。

2.5、通配符 
         在 LIKE 比较中,* 和 % 两者可以互换地作为通配符。如果 LIKE 子句中的字符串包含 * 或 %,那么这些字符应用中括号([])对其进行转义。如果子句中有中括号,那么中括号字符应用中括号对其进行转义(例如 [[] 或 []])。在模式的开头和结尾,或者在模式的结尾,或在模式的开头,都允许使用通配符。例如:

             "ItemName LIKE '*product*'"
             "ItemName LIKE '*product'"
             "ItemName LIKE 'product*'" 

在字符串的中间不允许使用通配符。例如,不允许 'te*xt'。

2.6、父/子关系引用 
         通过在列名称前面加 Parent,就可以在表达式中引用父表。例如,Parent.Price 引用父表的名为 Price 的列。
         通过在列名称前面加一个 Child,就可以在表达式中引用子表中的列。但是,因为子关系可以返回多行,所以必须在聚合函数中包括对子列的引用。例如,Sum(Child.Price) 将返回子表中名为 Price 的列的总和。
         如果某个表有多个子表,则语法是:Child(RelationName)。 例如:
         如果某个表有两个子表,它们的名称分别为 Customers 和 Orders,并且 DataRelation 对象被命名为 Customers2Orders,则引用将为: 
Avg(Child(Customers2Orders).Quantity)

2.7、聚合 
         2.7.1 支持聚合类型如下:

Sum(求和)

Avg(平均)

Min(最小值)

Max(最大值)

Count(计数)

StDev(统计标准偏差)

Var(统计方差)

 

聚合通常沿着关系执行。通过使用上面列出的函数之一和上面“父/子关系引用”中详述的子表列,来创建聚合表达式。例如:
            Avg(Child.Price) 
            Avg(Child(Orders2Details).Price)

聚合也可以在单个表上执行。例如,若要为名为“Price”的列中的数字创建汇总,就用: 
            Sum(Price)

如果表没有行,聚合函数将返回 空引用(在 Visual Basic 中为 Nothing)。
         数据类型总是可以通过检查列的 DataType 属性来确定。还可以使用 Convert 函数来转换数据类型,如下面这一部分所示。

2.8、支持下列函数:

2.8.1 CONVERT 
         说明 
            将特定表达式转换为指定的 .NET Framework 类型。 
         语法 Convert(expression, type) 
         参数 expression — 要转换的表达式。
         type — 值将转换成的 .NET Framework 类型。 
          例如:

             myDataColumn.Expression="Convert(total, 'System.Int32')" 

所有转换都是有效的,只有下列情况例外:Boolean 只能与 Byte、SByte、Int16、Int32、Int64、UInt16、UInt32、UInt64、String 和它本身相互转换。Char 只能与 Int32、UInt32、String 和它本身相互转换。DateTime 只能与 String 和它本身相互转换。TimeSpan 只能与 String 和它本身相互转换。

2.8.2 LEN 
            说明 获取字符串的长度 
            语法 LEN(expression) 
            参数 expression — 要计算的字符串。

             例如:myDataColumn.Expression="Len(ItemName)" 

2.8.3 ISNULL 
            说明 检查表达式并返回已检查的表达式或返回替换值。 
            语法 ISNULL(expression, replacementvalue) 
            参数 expression — 要检查的表达式。
            replacementvalue — 如果表达式为 空引用(在 Visual Basic 中为 Nothing),则返回 replacementvalue。

             例如:myDataColumn.Expression="IsNull(price, -1)" 

2.8.5 IIF 
            说明 根据逻辑表达式的结果,获取两个值之一。 
            语法 IIF(expr, truepart, falsepart) 
            参数 expr — 要计算的表达式。
            truepart — 表达式为真时返回的值。
            falsepart — 表达式为假时返回的值。

             例如:myDataColumn.Expression ="IIF(total>1000, 'expensive', 'dear') 

2.8.6 TRIM 
            说明 移除所有前导的和后缀的空格字符,如 "r、"n、"t、' ' 
            语法 TRIM(expression) 
            参数 expression — 要剪裁的表达式。

2.8.7 SUBSTRING 
            说明 获取从字符串中的指定点开始,具有指定长度的子字符串。 
            语法 SUBSTRING(expression, start, length) 
            参数 expression — 子字符串的源字符串。
            start — 指定子字符串开始位置的整数。
            length — 指定子字符串长度的整数。

             例如:myDataColumn.Expression ="SUBSTRING(phone, 7, 8)" 
DataTable.Compute方法使用实例
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data; namespace Console11
{
class Program
{
static void Main(string[] args)
{
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((float)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语句并且减轻服务器计算符合^&^ }
}
}

多个字段建立父子关系

 Private Sub CreateRelation()
' Get the DataColumn objects from two DataTable objects in a DataSet.
Dim parentCols() As DataColumn
Dim childCols() As DataColumn
' Code to get the DataSet not shown here.
parentCols() = DataSet1.Tables("Customers").Columns("CustID")
parentCols() = DataSet1.Tables("Customers").Columns("OrdID") childCols() = DataSet1.Tables("Orders").Columns("CustID")
childCols() = DataSet1.Tables("Orders").Columns("OrdID")
' Create DataRelation.
Dim CustOrderRel As DataRelation
CustOrderRel = New DataRelation("CustomersOrders", parentCols, childCols)
' Add the relation to the DataSet.
DataSet1.Relations.Add(CustOrderRel)
End Sub

DataTable.Compute()用法的更多相关文章

  1. C# DataTable.Compute()用法

    DataTable.Compute()用法 2010-04-07 11:28 一.DataTable.Compute()方法說明如下 作用:          计算用来传递筛选条件的当前行上的给定表达 ...

  2. 转:DataTable.Compute()用法

    转自:http://www.cnblogs.com/fanyf/archive/2012/05/11/2495919.html一.DataTable.Compute()方法說明如下 作用: 计算用来传 ...

  3. Datatable.Compute小技巧

    在个人版机房重构的过程中,大家最发愁的一件事无非就是上下机,结账和报表.那么在结账的过程中,最发愁的是否就数计算日结账单的数据和周结账的数据.还记得在第一遍机房收费系统的过程中用的是for 循环,但是 ...

  4. DataTable.Compute()

    一.DataTable.Compute()方法說明如下 作用:          计算用来传递筛选条件的当前行上的给定表达式. 格式為:          Object Compute (string ...

  5. C# DataTable Compute方法的使用

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

  6. DataTable.Compute方法使用实例

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...

  7. dataset 和DataTable的用法

    以下包含了这两种不同属性的用法: foreach (DataRow dr in dataset.Tables[0].Rows)            { if (i != 0 && l ...

  8. DataSet与DataTable基本用法

    http://files.cnblogs.com/files/monkeyZhong/DataSetExample.rar 在设计数据库操作或者XML操作等表格数据时,我们难免要跟DataSet和Da ...

  9. C# DataTable详细用法

    通过经常使用的项目中的DataTable,假设DataTable使用得当,不仅能使程序简洁有用,并且可以提高性能,达到事半功倍的效果,现对DataTable的使用技巧进行一下总结. 一.DataTab ...

随机推荐

  1. Jena TDB 102

    1 Introduction TDB is a RDF storage of Jena. official guarantees and limitations TDB support full ra ...

  2. sql语句与 数据库

    create  table  wyx( xh int primary key, xm varchar(20) not null, nl int, zcrq timestamp default curr ...

  3. IplImage 结构解读(转)

    typedef struct _IplImage { int nSize;                             /* IplImage大小 */ int ID;           ...

  4. QTableWidget实用技巧(转)

    http://blog.csdn.NET/mingxia_sui/article/details/7681863 在使用Qt不多的日子里,已经两次用到了QTableWidget这个控件,也慢慢的习惯和 ...

  5. Windows安装包制作指南——Advanced Installer的使用

    1. 前言 最近需要制作windows的安装包,据说Advanced Installer比较强大,遂拿它来制作安装包.在网上少量资料以及官网简约文档中摸索前进,总算是制作出可用的安装包,在此记录,仅供 ...

  6. MyEclipse Spring 学习总结一 Spring IOC容器

    一.Spring IOC容器---- Spring AllicationContext容器 程序的结构如下: 1.首先在MyEclipse 创建创建Java Project 2.创建好后,添加spin ...

  7. 如何让AutoCAD自动加载Arx,比如ArxDbg.arx

    1.在AutoCAD的安装根目录下,用记事本创建一个acad.rx文件,如下 ------acad.rx----- ArxDbg.arx -------------------- 2.将ArxDbg. ...

  8. IOS开发-项目实战-点赞功能的实现

    实现思路: 1.每一条新闻就是一个cell,在cell上添加点赞按钮. 2.让cell的控制器成为自定义cell的代理,将点击了哪一个cell放在代理方法中传出去. 3.并将这条新闻的ID和当前用户的 ...

  9. linux网络编程-(socket套接字编程UDP传输)

    今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...

  10. CrashHandler: java.lang.NullPointerException

    08-29 20:33:47.305 20636-20636/com.tongyan.subway.inspect D/AndroidRuntime: Shutting down VM 08-29 2 ...