この記事では、この API のリファレンス ドキュメントに補足的な解説を提供します。
Expression プロパティの 1 つの用途は、計算列を作成することです。 たとえば、税額を計算するには、単価に特定の地域の税率を乗算します。 税率は地域によって異なるため、列に 1 つの税率を配置することは不可能です。代わりに、次のコードに示すように、 Expression プロパティを使用して値が計算されます。
DataSet1.Tables("Products").Columns("tax").Expression = "UnitPrice * 0.086"
2 つ目の用途は、集計列を作成する方法です。 集計は、計算値と同様に、 DataTable内の行の完全なセットに基づいて操作を実行します。 簡単な例として、セットで返された行の数をカウントします。 これは、次のコードに示すように、特定の営業担当者が完了したトランザクションの数をカウントするために使用するメソッドです。
DataSet1.Tables("Orders").Columns("OrderCount").Expression = "Count(OrderID)"
式の構文
式を作成するときは、 ColumnName プロパティを使用して列を参照します。 たとえば、1 つの列の ColumnName が "UnitPrice" で、もう 1 つの "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[\]\\]
又は
Total * 'Column[]\'
ユーザー定義値
ユーザー定義値は、式内で列の値と比較するために使用できます。 文字列値は、単一引用符で囲む必要があります (また、文字列値の各単一引用符は、別の単一引用符文字を前置してエスケープする必要があります)。 日付値は、データ プロバイダーに基づいてポンド記号 (#) または単一引用符 (') で囲む必要があります。 10 進表記と指数表記は、数値に対して許容されます。 例えば次が挙げられます。
"FirstName = 'John'"
"Price <= 50.00"
"Birthdate < #1/31/2006#"
列挙値を含む列の場合は、値を整数データ型にキャストします。 例えば次が挙げられます。
"EnumColumn = 5"
リテラル式を解析する
すべてのリテラル式は、インバリアント カルチャ ロケールで表す必要があります。
DataSet
は、リテラル式を解析して変換するときに、常に、現在のカルチャではなくインバリアント カルチャを使用します。
文字列リテラルは、値を囲む単一引用符がある場合に識別されます。 たとえば、'John'
のようにします。
Boolean
リテラルはtrue
false
。式では引用符で囲まれません。
Integer
literals [+-]?[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
という名前の親テーブルの列を参照します。
子に複数の親行がある場合は、 Parent(RelationName).ColumnName
を使用します。 たとえば、 Parent(RelationName).Price
では、リレーションシップを介して "Price" という名前の親テーブルの列を参照します。
子テーブル内の列は、列名の前に Child
を付けることで、式内で参照できます。 ただし、子リレーションシップは複数の行を返す可能性があるため、集計関数に子列への参照を含める必要があります。 たとえば、 Sum(Child.Price)
は子テーブル内の Price
という名前の列の合計を返します。
テーブルに複数の子がある場合、構文は Child(RelationName)
です。 たとえば、テーブルに Customers
と Orders
という名前の 2 つの子テーブルがあり、 DataRelation オブジェクトの名前が Customers2Orders
の場合、参照は次のようになります。
Avg(Child(Customers2Orders).Quantity)
集合体
次の集計型がサポートされています。
-
Sum
(合計) -
Avg
(平均) -
Min
(最小) -
Max
(最大値) -
Count
(カウント) -
StDev
(統計的標準偏差) -
Var
(統計的差異)
通常、集計はリレーションシップに沿って実行されます。 前述の関数の 1 つと 、親/子関係の参照で詳しく説明されている子テーブル列を使用して、集計式を作成します。 例えば次が挙げられます。
Avg(Child.Price)
Avg(Child(Orders2Details).Price)
集計は、1 つのテーブルに対しても実行できます。 たとえば、"Price" という名前の列に図表の概要を作成するには、次のようにします。
Sum(Price)
注
1 つのテーブルを使用して集計を作成する場合、グループ化機能はありません。 代わりに、すべての行が列に同じ値を表示します。
テーブルに行がない場合、集計関数は null
を返します。
データ型は、列の DataType プロパティを調べることによって常に決定できます。 次のセクションに示すように、 Convert
関数を使用してデータ型を変換することもできます。
集計は 1 つの列にのみ適用でき、集計内で他の式を使用することはできません。
機能
次の関数もサポートされています。
CONVERT
この関数は、式を指定した .NET 型に変換します。
Convert(expression, type)
引数 | 説明 |
---|---|
expression |
変換する式。 |
type |
値の変換先となる .NET 型。 |
例: 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 |
式が null の場合は、 replacementvalue が返されます。 |
例: myDataColumn.Expression="IsNull(price, -1)"
IIF
この関数は、論理式の結果に応じて 2 つの値のいずれかを取得します。
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)"
注
Expressionプロパティは、null 値または空の文字列を割り当てることでリセットできます。 式列に既定値が設定されている場合、 Expression プロパティがリセットされた後、以前に入力されたすべての行に既定値が割り当てられます。
.NET