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 字面量是 truefalse;它们不会在表达式中加引号。

Integer 文本 [+-]?[0-9]+ 被视为 System.Int32System.Int64System.DoubleSystem.Double 可能会丢失精度,具体取决于数字的大小。 例如,如果文本中的数字是2147483650,DataSet 将首先尝试将其解析为一个 Int32。 这不会成功,因为数字太大。 在这种情况下 DataSet,将数字解析为 Int64,将成功。 如果字面量是一个大于 Int64 最大值的数字,则 DataSet 使用 Double 分析字面量。

使用科学记数法(如 4.42372E-30)的真实字面量通过 System.Double 进行解析。

没有科学表示法但带有小数点的实数文字被视为 System.Decimal。 如果数字超过所 System.Decimal支持的最大值或最小值,则会将其分析为 a System.Double。 例如:

  • 142526.144524 被转换为 Decimal
  • 345262.78036719560925667 被视为一种 Double

运营商

允许使用布尔 AND、OR 和 NOT 运算符进行串联。 可以使用括号对语句进行分组和控制优先级。 AND 运算符优先于其他运算符。 例如:

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

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

  • <
  • >
  • <=
  • >=
  • =
  • IN
  • LIKE

表达式中还支持以下算术运算符:

  • + (加法)
  • - (减法)
  • *(乘法)
  • /(除法)
  • % (模数)

字符串运算符

若要连接字符串,请使用 + 字符。 CaseSensitive类的DataSet属性值决定字符串比较是否区分大小写。 但是,可以使用类的属性CaseSensitive替代该值DataTable

通配符

*% 字符在 LIKE 比较中可以互换用作通配符。 如果 LIKE 子句中的字符串包含 *%,这些字符应括在方括号中([])。 如果括号位于子句中,则应将每个括号字符括在括号中(例如 [[][]])。 通配符允许出现在模式的开始和结束处、模式的结束处或模式的开始处。 例如:

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

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

父子关系引用

在表达式中引用父表时,可以在列名前加上 Parent。 例如, Parent.Price 引用名为 Price.. 的父表列。

当子项具有多个父行时,使用 Parent(RelationName).ColumnName。 例如, Parent(RelationName).Price 通过关系引用名为“Price”的父表列。

在表达式中引用子表中的列时,可以在列名前加上Child。 但是,由于子关系可能返回多个行,因此必须在聚合函数中包含对子列的引用。 例如, Sum(Child.Price) 将返回子表中命名 Price 的列的总和。

如果表有多个子表,则语法为:Child(RelationName)。 例如,如果表具有两个命名CustomersOrders的子表,并且该DataRelation对象被命名Customers2Orders,则引用如下所示:

Avg(Child(Customers2Orders).Quantity)

聚合

支持以下聚合类型:

  • Sum (总和)
  • Avg (平均值)
  • Min (最小值)
  • Max (最大值)
  • Count(计数)
  • StDev (统计标准偏差)
  • Var (统计方差)

通常,聚合会基于关系执行。 使用前面列出的函数之一和子表列创建聚合表达式,如 父/子关系引用中详述。 例如:

  • Avg(Child.Price)
  • Avg(Child(Orders2Details).Price)

还可以对单个表执行聚合。 例如,若要在名为Price的列中生成数据汇总:

Sum(Price)

注释

如果使用单个表创建聚合,则不会有 GROUP BY 的功能。 相反,所有行都会在列中显示相同的值。

如果表没有行,聚合函数将返回 null

可以通过检查 DataType 列的属性来确定数据类型。 还可以使用函数 Convert 转换数据类型,如以下部分所示。

聚合只能应用于单个列,不能在聚合中使用其他表达式。

功能

还支持以下函数。

CONVERT

此函数将表达式转换为指定的 .NET 类型。

Convert(expression, type)
论点 DESCRIPTION
expression 要转换的表达式。
type 值将被转换为的 .NET 类型。

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

所有转换都是有效的,但有以下例外:Boolean只能强制转换为或从ByteSByteInt16Int32Int64UInt16UInt32UInt64String及其自身进行转换。 Char只能在 Int32UInt32String 和自身之间进行强制转换。 DateTime 只能在 String 和自身之间进行强制转换。 TimeSpan 只能在 String 和自身之间进行强制转换。

LEN

此函数获取字符串的长度。

LEN(expression)
论据 DESCRIPTION
expression 要计算的字符串。

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

ISNULL

此函数检查表达式,并返回检查的表达式或替换值。

ISNULL(expression, replacementvalue)
论据 DESCRIPTION
expression 要检查的表达式。
replacementvalue 如果表达式为 nullreplacementvalue 则返回。

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

IIF

此函数根据逻辑表达式的结果获取两个值之一。

IIF(expr, truepart, falsepart)
论据 DESCRIPTION
expr 要计算的表达式。
truepart 表达式为 true 时要返回的值。
falsepart 表达式为 false 时要返回的值。

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

TRIM

此函数删除所有前导和尾随空白字符,例如 \r、\n、\t 和'。

TRIM(expression)
论点 DESCRIPTION
expression 要剪裁的表达式。

SUBSTRING

此函数获取指定长度的子字符串,从字符串中的指定点开始。

SUBSTRING(expression, start, length)
论点 DESCRIPTION
expression 子字符串的源字符串
start 指定子字符串开始位置的整数。
length 指定子字符串长度的整数。

示例:myDataColumn.Expression = "SUBSTRING(phone, 7, 8)"

注释

可以通过为其分配 null 值或空字符串来重置 Expression 属性。 如果在表达式列上设置了默认值,则会在重置属性后 Expression 为所有以前填充的行分配默认值。