System.Data.DataColumn.Expression 属性
本文提供了此 API 参考文档的补充说明。
该 Expression 属性的一个用法是创建计算列。 例如,若要计算税值,单价乘以特定区域的税率。 由于税率因区域而异,因此不可能将单个税率放在列中:而是使用 Expression 属性计算值,如以下代码所示:
DataSet1.Tables("Products").Columns("tax").Expression = "UnitPrice * 0.086"
第二个用途是创建聚合列。 与计算值类似,聚合基于其中 DataTable的完整行集执行操作。 一个简单的示例是计算集中返回的行数。 这是用于计算特定销售人员完成的事务数的方法,如以下代码所示:
DataSet1.Tables("Orders").Columns("OrderCount").Expression = "Count(OrderID)"
表达式语法
创建表达式时,使用 ColumnName 属性引用列。 例如,如果一列的 ColumnName 值为“UnitPrice”,另一列为“Quantity”,则表达式为:
"UnitPrice * Quantity"
注意
如果在表达式中使用列,则表示表达式依赖于该列。 如果重命名或删除依赖列,则不会引发异常。 访问现在中断的表达式列时,将引发异常。
为筛选器创建表达式时,用单引号将字符串括起来:
"LastName = 'Jones'"
如果列名包含任何非字母数字字符、以数字开头或匹配(不区分大小写)任何以下保留字,则需要特殊处理,如以下段落中所述。
And
Between
Child
False
In
Is
Like
Not
Null
Or
Parent
True
如果列名满足上述条件之一,则必须用方括号或“'”(严重重音)引号括起来。 例如,若要在表达式中使用名为“Column#”的列,需要编写“[Column#]”或“'Column#'”:
Total * [Column#]
如果列名括在方括号中,则必须使用反斜杠(“\”)字符前面加上任何“]”和“\”字符(但不是任何其他字符)进行转义。 如果列名括在严重重音字符中,则它不得包含任何严重重音字符。 例如,将写入名为“Column[]\”的列:
Total * [Column[\]\\]
或
总计 * 'Column[]\'
用户定义的值
用户定义的值可以在表达式中使用,以便与列值进行比较。 字符串值应括在单引号内(字符串值中的每个单引号字符必须用另一个单引号开头进行转义)。 日期值应括在磅号(#)或单引号(')内,具体取决于数据提供程序。 数值允许使用十进制数和科学表示法。 例如:
"FirstName = 'John'"
"Price <= 50.00"
"Birthdate < #1/31/2006#"
对于包含枚举值的列,请将值强制转换为整数数据类型。 例如:
"EnumColumn = 5"
分析文本表达式
所有文本表达式都必须以固定区域性区域设置表示。 分析并转换文本表达式时 DataSet
,它始终使用固定区域性,而不是当前区域性。
当值周围有单引号时,将标识字符串文本。 例如 'John'
。
Boolean
文本是 true
和 false
;它们不会在表达式中引起来。
Integer
文本 [+-]?[0-9]+ 被视为 System.Int32
, System.Int64
或 System.Double
。 System.Double
可能会丢失精度,具体取决于数字的大小。 例如,如果文本中的数字2147483650, DataSet
将首先尝试将数字分析为一个 Int32
。 这不会成功,因为数字太大。 在这种情况下 DataSet
,将数字分析为一个 Int64
,这将成功。 如果文本大于 Int64 DataSet
的最大值,则使用 <
使用科学表示法(如 4.42372E-30)的实际文本使用 System.Double
。
没有科学表示法但带有小数点的实际文本被视为 System.Decimal
。 如果数字超过所 System.Decimal
支持的最大值或最小值,则会将其分析为 a System.Double
。 例如:
- 142526.144524 转换为 a
Decimal
. - 345262.78036719560925667 被视为一种
Double
。
运算符
允许使用布尔 AND、OR 和 NOT 运算符进行串联。 可以使用括号对子句进行分组和强制优先级。 AND 运算符优先于其他运算符。 例如:
(LastName = 'Smith' OR LastName = 'Jones') AND FirstName = 'John'
创建比较表达式时,允许使用以下运算符:
- <
- >
- <=
- >=
- =
IN
LIKE
表达式中还支持以下算术运算符:
- +(加法)
- - (减法)
- *(乘法)
- /(除法)
- % (模数)
字符串运算符
若要连接字符串,请使用 +
字符。 类的属性DataSet值CaseSensitive确定字符串比较是否区分大小写。 但是,可以使用类的属性DataTable替代该值CaseSensitive。
Wild卡 字符
*
%
在 LIKE 比较中,字符和字符都可以互换用于 wild卡 字符。 如果 LIKE 子句中的字符串包含或*
%
,这些字符应括在方括号中([]
)。 如果括号位于子句中,则应将每个括号字符括在括号中(例如 [[]
或 []]
)。 允许在模式的开头和结尾、模式末尾或模式的开头或模式的开头使用野生卡。 例如:
"ItemName LIKE '*product*'"
"ItemName LIKE '*product'"
"ItemName LIKE 'product*'"
字符串中间不允许使用 Wild卡 字符。 例如,不允许使用 'te*xt'
。
引用父/子关系
父表可以通过前面加上列名 Parent
来引用表达式中。 例如, Parent.Price
引用名为 Price
.. 的父表列。
当子级具有多个父行时,请使用 Parent(RelationName).ColumnName
。 例如, Parent(RelationName).Price
通过关系引用名为“Price”的父表列。
子表中的列可以通过前面加上列名 Child
来引用表达式中。 但是,由于子关系可能返回多个行,因此必须在聚合函数中包含对子列的引用。 例如, Sum(Child.Price)
将返回子表中命名 Price
的列的总和。
如果表有多个子级,则语法为: Child(RelationName)
。 例如,如果表具有两个命名Customers
Orders
的子表,并且该DataRelation对象被命名Customers2Orders
,则引用如下所示:
Avg(Child(Customers2Orders).Quantity)
聚合
支持以下聚合类型:
Sum
(总和)Avg
(平均值)Min
(最小值)Max
(最大值)Count
(计数)StDev
(统计标准偏差)Var
(统计方差)
聚合通常沿关系执行。 使用前面列出的函数之一和子表列创建聚合表达式,如父/子关系引用中详述。 例如:
Avg(Child.Price)
Avg(Child(Orders2Details).Price)
还可以对单个表执行聚合。 例如,若要在名为“Price”的列中创建图表摘要:
Sum(Price)
注意
如果使用单个表创建聚合,则不会有分组依据功能。 相反,所有行都会在列中显示相同的值。
如果表没有行,聚合函数将返回 null
。
可以通过检查 DataType 列的属性来确定数据类型。 还可以使用函数 Convert
转换数据类型,如以下部分所示。
聚合只能应用于单个列,不能在聚合中使用其他表达式。
函数
还支持以下函数。
CONVERT
此函数将表达式转换为指定的 .NET 类型。
Convert(expression, type)
参数 | 说明 |
---|---|
expression |
要转换的 表达式。 |
type |
将值转换为的 .NET 类型。 |
示例: myDataColumn.Expression="Convert(total, 'System.Int32')"
所有转换都有效,但有以下例外情况:Boolean
只能强制转换到、从Byte
、、SByte
、Int16
、UInt16
Int64
UInt32
Int32
、、UInt64
和String
本身进行转换。 Char
只能强制和从Int32
中UInt32
String
、 和本身。 DateTime
只能强制和从 String
其本身。 TimeSpan
只能强制和从 String
其本身。
LEN
此函数获取字符串的长度。
LEN(expression)
参数 | 说明 |
---|---|
expression |
要计算的字符串。 |
示例: myDataColumn.Expression="Len(ItemName)"
ISNULL
此函数检查表达式,并返回检查表达式或替换值。
ISNULL(expression, replacementvalue)
参数 | 说明 |
---|---|
expression |
要检查的表达式。 |
replacementvalue |
如果表达式为 null , replacementvalue 则返回。 |
示例: myDataColumn.Expression="IsNull(price, -1)"
IIF
此函数根据逻辑表达式的结果获取两个值之一。
IIF(expr, truepart, falsepart)
参数 | 说明 |
---|---|
expr |
要计算的表达式。 |
truepart |
如果表达式为 true,则返回的值。 |
falsepart |
如果表达式为 false,则返回的值。 |
示例: myDataColumn.Expression = "IIF(total>1000, 'expensive', 'dear')
TRIM
此函数删除所有前导和尾随空白字符,如 \r、\n、\t 和 ' '。
TRIM(expression)
参数 | 说明 |
---|---|
expression |
要剪裁的表达式。 |
SUBSTRING
此函数获取指定长度的子字符串,从字符串中的指定点开始。
SUBSTRING(expression, start, length)
参数 | 说明 |
---|---|
expression |
子字符串的源字符串 |
start |
指定子字符串开始位置的整数。 |
length |
指定子字符串长度的整数。 |
示例: myDataColumn.Expression = "SUBSTRING(phone, 7, 8)"
注意
可以通过为其分配 null 值或空字符串来重置 Expression 属性。 如果在表达式列上设置了默认值,则会在重置属性后 Expression 为所有以前填充的行分配默认值。