DataTable.Compute()用法2010-04-0711:28一、DataTable.Compute()方法說明如下作用计算用来传递筛选条件的当前行上的给 DataTable.Compute()用法 2010-04-07 11:28 一、DataTable.Compute()方法說明如下作用
"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.、支持下列函数 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("11", ""); Console.WriteLine(test); string a "123"; System.Double b123; decimal c123m; Console.WriteLine((float)a); //test2; test table.Compute("11", "false"); Console.WriteLine(test); //test2;常数计算和filter无关 test table.Compute("abs(1)", ""); Console.WriteLine(test); //testnull不知道为这个什么没有报错而且返回null,其他的数学函数都会抱错 test table.Compute("2%2", ""); Console.WriteLine(test); //test0; //其他函数参考下面的计算列 //初始化datatale table.Columns.Add("id", typeof(string)); table.Columns.Add("value", typeof(int)); for (int i 1; i 5,1000,2000)"; test table.Select("idid1")[0]["exp1"]; Console.WriteLine(test); //test2000; //like运算符 column.Expression "iif(id like %1,1000,2000)"; test table.Select("idid1")[0]["exp1"]; Console.WriteLine(test); //test1000; //in运算符 column.Expression "iif(id not in(id1),1000,2000)"; test table.Select("idid1")[0]["exp1"]; Console.WriteLine(test); //test2000; //嵌套的三元运算 column.Expression "iif(value>5,1000,iif(id like %1,4000,2000))"; test table.Select("idid1")[0]["exp1"]; Console.WriteLine(test); //test4000; //客户端计算所占总数的百分比 column.Expression "value/sum(value)"; test table.Select("idid1")[0]["exp1"]; Console.WriteLine(test); //test0.01818182 //客户端计算差值,比如nba常规赛的胜场差 column.Expression "max(value)-value"; test table.Select("idid1")[0]["exp1"]; Console.WriteLine(test); //test9 //***********************父子表计算*************************************/ //初始化子表,父子表关系 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 0,0,value-sum(child(relation).value))"; test table.Select("idid1")[0]["exp1"]; Console.WriteLine(test); //test-54; //比较遗憾的是没有发现能够计算同比和环比的方法而且计算列无法作为约束 //************结束DataTable可以让你尽量发挥聪明才智来减少繁杂的sql语句并且减轻服务器计算符合^&^ } } }转:https://www.cnblogs.com/LuoEast/p/9585775.html