System.Data.DataColumn.Expression プロパティ
この記事では、この 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 使用して列を参照します。 たとえば、ある列の ColumnName 列が "UnitPrice" で、もう 1 つの "Quantity" である場合、式は次のようになります。
"UnitPrice * Quantity"
Note
式で列が使用されている場合、式はその列に依存していると言われます。 依存列の名前が変更または削除された場合、例外はスローされません。 現在壊れている式列にアクセスすると、例外がスローされます。
フィルターの式を作成する場合は、文字列を単一引用符で囲みます。
"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
式では、次の算術演算子もサポートされています。
- + (加算)
- - (減算)
- * (乗算)
- / (除算)
- % (剰余)
文字列演算子
文字列を連結するには、その文字を使用します +
。 クラスのプロパティの CaseSensitive 値によって、 DataSet 文字列比較で大文字と小文字が区別されるかどうかが決まります。 ただし、その値はクラスのDataTableプロパティでCaseSensitiveオーバーライドできます。
ワイルドカード文字
LIKE 比較では、*
両方の%
文字をワイルドカード文字に同じ意味で使用できます。 LIKE 句の文字列に or が含まれている*
%
場合は、それらの文字を角かっこ ([]
) で囲む必要があります。 句に角かっこが含まれている場合は、各角かっこ文字を角かっこで囲む必要があります (例: [[]
または []]
)。 ワイルドカードは、パターンの先頭と末尾、またはパターンの末尾、またはパターンの先頭で許可されます。 次に例を示します。
"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)
。 たとえば、テーブルに 2 つの子テーブルが名前がOrders
付けられ、オブジェクトに名前Customers
が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)
Note
1 つのテーブルを使用して集計を作成する場合、グループ化機能はありません。 代わりに、すべての行が列に同じ値を表示します。
テーブルに行がない場合、集計関数は .null
データ型は、列のプロパティを調べることによって常に DataType 決定できます。 次のセクションに示すように、関数を Convert
使用してデータ型を変換することもできます。
集計は 1 つの列にのみ適用でき、集計内で他の式を使用することはできません。
関数
次の関数もサポートされています。
CONVERT
この関数は、式を指定した .NET 型に変換します。
Convert(expression, type)
引数 | 説明 |
---|---|
expression |
変換する 式。 |
type |
値の変換先となる .NET 型。 |
例: myDataColumn.Expression="Convert(total, 'System.Int32')"
すべての変換は、次の例外を除 Boolean
SByte
UInt64
Byte
Int32
String
Int16
Int64
UInt16
UInt32
いて有効です。 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)"
Note
プロパティを Expression リセットする場合は、null 値または空の文字列を割り当てます。 式列に既定値が設定されている場合、プロパティがリセットされた後、以前に入力されたすべての行に Expression 既定値が割り当てられます。
.NET