DataColumn.Expression 属性

定义

获取或设置用于筛选行、计算列中的值或创建聚合列的表达式。

public:
 property System::String ^ Expression { System::String ^ get(); void set(System::String ^ value); };
public string Expression { get; [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("Members from types used in the expressions may be trimmed if not referenced directly.")] set; }
public string Expression { get; set; }
[System.Data.DataSysDescription("DataColumnExpressionDescr")]
public string Expression { get; set; }
[<set: System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("Members from types used in the expressions may be trimmed if not referenced directly.")>]
member this.Expression : string with get, set
member this.Expression : string with get, set
[<System.Data.DataSysDescription("DataColumnExpressionDescr")>]
member this.Expression : string with get, set
Public Property Expression As String

属性值

用于计算列值或创建聚合列的表达式。 表达式的返回类型由 DataType 列确定。

属性

例外

AutoIncrementUnique属性设置为 true.

使用 CONVERT 函数时,表达式的计算结果为字符串,但字符串不包含可转换为类型参数的表示形式。

使用 CONVERT 函数时,无法执行请求的强制转换。 有关可能的强制转换的详细信息,请参阅以下部分中的转换函数。

使用 SUBSTRING 函数时,起始参数的范围不足。

-或者-

使用 SUBSTRING 函数时,长度参数的范围不足。

使用 LEN 函数或 TRIM 函数时,表达式不会计算为字符串。 这包括计算结果为 Char.

示例

以下示例在一个 DataTable. 中创建三列。 第二列和第三列包含表达式;第二个使用可变税率计算税,第三个计算结果将计算结果添加到第一列的值。 生成的表显示在控件 DataGrid 中。

private void CalcColumns()
{
    DataTable table = new DataTable ();

    // Create the first column.
    DataColumn priceColumn = new DataColumn();
    priceColumn.DataType = System.Type.GetType("System.Decimal");
    priceColumn.ColumnName = "price";
    priceColumn.DefaultValue = 50;

    // Create the second, calculated, column.
    DataColumn taxColumn = new DataColumn();
    taxColumn.DataType = System.Type.GetType("System.Decimal");
    taxColumn.ColumnName = "tax";
    taxColumn.Expression = "price * 0.0862";

    // Create third column.
    DataColumn totalColumn = new DataColumn();
    totalColumn.DataType = System.Type.GetType("System.Decimal");
    totalColumn.ColumnName = "total";
    totalColumn.Expression = "price + tax";

    // Add columns to DataTable.
    table.Columns.Add(priceColumn);
    table.Columns.Add(taxColumn);
    table.Columns.Add(totalColumn);

    DataRow row = table.NewRow();
    table.Rows.Add(row);
    DataView view = new DataView(table);
    dataGrid1.DataSource = view;
}
Private Sub CalcColumns()
     Dim rate As Single = .0862
     Dim table As New DataTable()
 
     ' Create the first column.
     Dim priceColumn As New DataColumn()
     With priceColumn
         .DataType = System.Type.GetType("System.Decimal")
         .ColumnName = "price"
         .DefaultValue = 50
     End With
     
     ' Create the second, calculated, column.
     Dim taxColumn As New DataColumn()
     With taxColumn
         .DataType = System.Type.GetType("System.Decimal")
         .ColumnName = "tax"
         .Expression = "price * 0.0862"
     End With
     
    ' Create third column
     Dim totalColumn As New DataColumn()
     With totalColumn
         .DataType = System.Type.GetType("System.Decimal")
         .ColumnName = "total"
         .Expression = "price + tax"
     End With
 
     ' Add columns to DataTable
     With table.Columns
         .Add(priceColumn)
         .Add(taxColumn)
         .Add(totalColumn)
     End With
    
     Dim row As DataRow= table.NewRow
     table.Rows.Add(row)
     Dim view As New DataView
     view.Table = table
     DataGrid1.DataSource = view
 End Sub

注解

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)

Aggregates

支持以下聚合类型:

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

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

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

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

Sum(Price)

注释

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

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

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

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

Functions

还支持以下函数。

CONVERT

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

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

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

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

LEN

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

LEN(expression)
Arguments Description
expression 要计算的字符串。

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

ISNULL

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

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

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

IIF

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

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

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

TRIM

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

TRIM(expression)
Argument Description
expression 要剪裁的表达式。

SUBSTRING

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

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

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

注释

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

适用于

另请参阅