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 的最大值,则使用 <a0/a0> 分析文本。

使用科学表示法(如 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

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

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

字符串运算符

若要连接字符串,请使用 + 字符。 类的属性DataSetCaseSensitive确定字符串比较是否区分大小写。 但是,可以使用类的属性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)。 例如,如果表具有两个命名CustomersOrders的子表,并且该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、、SByteInt16UInt16Int64UInt32Int32、、UInt64String本身进行转换。 Char只能强制和从Int32UInt32String、 和本身。 DateTime 只能强制和从 String 其本身。 TimeSpan 只能强制和从 String 其本身。

LEN

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

LEN(expression)
参数 说明
expression 要计算的字符串。

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

ISNULL

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

ISNULL(expression, replacementvalue)
参数 说明
expression 要检查的表达式。
replacementvalue 如果表达式为 nullreplacementvalue 则返回。

示例: 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 为所有以前填充的行分配默认值。