獲取或設置表達式,用於篩選行、計算列中的值或創建聚合列。
程序集: System.Data(在 System.Data.dll 中)
Expression 屬性的一個用途是創建計算出的列。 例如,若要計算稅值,就要將單價乘以特定地區的稅率。 由於各地稅率不同,不可能將單一稅率放在一個列中;於是便用 Expression 屬性來計算這個值,如下面這一部分中的 Visual Basic 代碼所示:
DataSet1.Tables("Products").Columns("tax").Expression = "UnitPrice * 0.086"
第二個用途是創建聚合列。 類似於計算出的值,聚合基於 DataTable 中的整個行集執行操作。 一個簡單的示例就是計算該集中返回的行數。 這便是您將用來計算特定銷售人員所完成的交易數的方法,如下面的 Visual Basic 代碼所示:
DataSet1.Tables("Orders").Columns("OrderCount").Expression = "Count(OrderID)"
表達式語法
在創建表達式時,使用 ColumnName 屬性來引用列。 例如,如果一個列的 ColumnName 是“UnitPrice”,而另一個是“Quantity”,則表達式將是:
"UnitPrice * Quantity"
![]() |
---|
如果在表達式中使用了某個列,則該表達式就存在一個對該列的依賴項。 重命名或移除依賴列時不會引發異常。 當訪問缺少了依賴項的表達式列時,將引發異常。 |
在為篩選器創建表達式時,用單引號將字符串括起來:
"LastName = 'Jones'"
如果列名稱包含任何非字母數字字符、以數字開頭或匹配(不分大小寫)以下任意的保留字,則它需要特殊處理,如下面的段落中所述。
And
之間
子級
False
在 ... 中
Is
Like
Not
Null
Or
父級
True
如果列名稱滿足上述條件之一,則它必須被包括在方括號中或在“`”(重音符)引號中。 例如,若要在表達式中使用名為“Column#”的列,應寫成“[Column#]”:
Total * [Column#]
或 "`列號`":
Total * `Column#`
如果列名稱括在方括號中,則必須通過在所有“]”和“\”字符(不是任何其他字符)前添加反斜杠(“\”)字符來跳過這些字符。 如果列名稱括在重音字符中,則它不能包含任何重音字符。例如,名為“Column[]\”的列應寫成:
Total * [Column[\]\\]
或
Total * `Column[]\`
用戶定義的值
用戶定義的值可以用在將與列值進行比較的表達式內。 應將字符串值括在單引號中(字符串值中的每個單引號字符必須由前將其添加與另一單引號字符轉義)。 日期值應用井號 (#) 或單引號 (') 括起來,具體取決於數據提供程序。 對於數值,允許使用小數和科學記數法。 例如:
"FirstName = 'John'"
"Price <= 50.00"
"Birthdate < #1/31/82#"
對於包含枚舉值的列,將值強制轉換為整數數據類型。 例如:
"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 將使用 Double 分析文本。
使用科學記數法的真實文本(如 4.42372E-30)使用 System.Double 進行分析。
不使用科學記數法但使用小數點的真實文本將被視為 System.Decimal。 如果數量超過了 System.Decimal 支持的最大值或最小值,則它被分析為 System.Double。 例如:
142526.144524 將轉換為 Decimal。
345262.78036719560925667 將被視為 Double。
運算符
使用布爾值 AND、OR 和 NOT 運算符時允許串聯。 可以使用括號來組合子句和強制優先級。 AND 運算符優先於其他運算符。 例如:
(LastName = 'Smith' OR LastName = 'Jones') AND FirstName = 'John'
在創建比較表達式時,允許使用下列運算符:
<
>
<=
>=
<>
=
IN
LIKE
在表達式中還支持下列算術運算符:
“+”(加)
-(減號)
*(乘號)
/(除號)
%(模數)
字符串運算符
若要連接字符串,請使用 + 字符。 DataSet 類的 CaseSensitive 屬性的值確定字符串比較是否區分大小寫。 但是,可以用 DataTable 類的 CaseSensitive 屬性重寫該值。
通配符
在 LIKE 比較中,* 和 % 兩者可以互換地作為通配符。 如果 LIKE 子句中的字符串包含 * 或 %,那么這些字符應包含在中括號([])中。 如果子句中有括號,則每個括號字符都應包括在括號中(例如 [[] 或 []])。 在模式的開頭和結尾,或者在模式的結尾,或在模式的開頭,都允許使用通配符。 例如:
"ItemName LIKE '*product*'"
"ItemName LIKE '*product'"
"ItemName LIKE 'product*'"
在字符串的中間不允許使用通配符。 例如,不允許 'te*xt'。
父/子關系引用
通過在列名稱前面加 Parent,就可以在表達式中引用父表。 例如,Parent.Price 引用父表的名為 Price 的列。
當子行具有多個父行時,請使用父 (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)
![]() |
---|
如果使用一個表來創建聚合,將沒有組合功能。 相反,所有行都在列中顯示相同的值。 |
如果表沒有行,聚合函數將返回 。
數據類型總是可以通過檢查列的 DataType 屬性來確定。 還可以使用 Convert 函數來轉換數據類型,如下面這一部分所示。
函數
還支持下列函數:
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 和其本身之間。
LEN
說明 |
獲取字符串的長度 |
語法 |
LEN(expression) |
參數 |
expression — 要計算的字符串。 |
例如:myDataColumn.Expression="Len(ItemName)"
ISNULL
說明 |
檢查表達式並返回已檢查的表達式或返回替換值。 |
語法 |
ISNULL(expression, replacementvalue) |
參數 |
expression — 要檢查的表達式。 replacementvalue — 如果表達式為 ,則返回 replacementvalue。 |
例如:myDataColumn.Expression="IsNull(price, -1)"
IIF
說明 |
根據邏輯表達式的結果,獲取兩個值之一。 |
語法 |
IIF(expr, truepart, falsepart) |
參數 |
expr — 要計算的表達式。 truepart — 表達式為真時返回的值。 falsepart — 表達式為假時返回的值。 |
例如: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)"
![]() |
---|
可以向 Expression 屬性分配一個空值或空字符串,來重置該屬性。 如果為表達式列設置了一個默認值,則在重置 Expression 屬性之后,這個默認值就賦給所有以前填充過的行。 |
下面的示例在 DataTable 中創建三個列。 第二和第三列包含表達式;第二列使用可變稅率計算稅款,第三列將計算的結果添加到第一列的值。 結果表顯示在 DataGrid 控件中。
Private Sub CalcColumns()
Dim rate As Single = .0862
dim table as DataTable = New DataTable
' Create the first column.
Dim priceColumn As DataColumn = New DataColumn
With priceColumn
.DataType = System.Type.GetType("System.Decimal")
.ColumnName = "price"
.DefaultValue = 50
End With
' Create the second, calculated, column.
Dim taxColumn As DataColumn = New DataColumn
With taxColumn
.DataType = System.Type.GetType("System.Decimal")
.ColumnName = "tax"
.Expression = "price * 0.0862"
End With
' Create third column
Dim totalColumn As DataColumn = 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
-
- 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;
- }
-
Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008(不支持服務器核心角色), Windows Server 2008 R2(支持帶 SP1 或更高版本的服務器核心角色;不支持 Itanium)
.NET Framework 並不是對每個平台的所有版本都提供支持。有關支持的版本的列表,請參見 .NET Framework 系統要求 。