Language

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 によって決まります。

属性

例外

AutoIncrement または Unique プロパティは、trueに設定されます。

CONVERT 関数を使用している場合、式は文字列に評価されますが、文字列には型パラメーターに変換できる表現が含まれていません。

CONVERT 関数を使用している場合、要求されたキャストは実行できません。 可能なキャストの詳細については、次のセクションの Conversion 関数を参照してください。

SUBSTRING 関数を使用すると、開始引数が範囲外になります。

-Or-

SUBSTRING 関数を使用すると、長さの引数が範囲外になります。

LEN 関数または TRIM 関数を使用する場合、式は文字列に評価されません。 これには、 Charに評価される式が含まれます。

例

次の例では、 DataTableに 3 つの列を作成します。 2 番目と 3 番目の列には式が含まれています。2 つ目は可変税率を使用して税を計算し、3 つ目は計算結果を最初の列の値に追加します。 結果のテーブルは、 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 プロパティの 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"

Note

式で列が使用されている場合、式はその列に依存していると言われます。 依存列の名前が変更または削除された場合、例外はスローされません。 現在壊れている式の列にアクセスすると、例外がスローされます。

フィルターの式を作成する場合は、文字列を単一引用符で囲みます。

"LastName = 'Jones'"

列名に英数字以外の文字が含まれている場合、数字で始まる場合、または次の予約語のいずれかに一致する (大文字と小文字を区別しない) 場合は、次の段落で説明するように特別な処理が必要です。

And

Between

Child

False

In

Is

Like

Not

Null

Or

Parent

True

列名が前述のいずれかの条件を満たす場合は、角括弧または「`」(グレイブアクセント)で囲む必要があります。 たとえば、式で "Column#" という名前の列を使用するには、"[Column#]" または "'Column#" を記述します。

Total * [Column#]

列名が角かっこで囲まれている場合、その中の任意の ']' 文字と '\' 文字 (他の文字は除く) は、バックスラッシュ ("\") 文字を前置してエスケープする必要があります。 列名がグレーブ アクセント文字で囲まれている場合は、その列名にグレーブ アクセント文字を含めてはなりません。 たとえば、"Column[]\" という名前の列が書き込まれます。

Total * [Column[\]\\]

または

合計 * `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として扱われます。

Operators

連結は、ブール値 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) です。 たとえば、テーブルに Customers と Orders という名前の 2 つの子テーブルがあり、 DataRelation オブジェクトの名前が Customers2Orders の場合、参照は次のようになります。

Avg(Child(Customers2Orders).Quantity)

Aggregates

次の集計型がサポートされています。

  • 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 つの列にのみ適用でき、集計内で他の式を使用することはできません。

Functions

次の関数もサポートされています。

CONVERT

この関数は、式を指定した .NET 型に変換します。

Convert(expression, type)
Argument Description
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)
引数 Description
expression 評価される文字列。

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

ISNULL

この関数は式をチェックし、チェックされた式または置換値を返します。

ISNULL(expression, replacementvalue)
引数 Description
expression 調べる式。
replacementvalue 式が nullの場合は、 replacementvalue が返されます。

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

IIF

この関数は、論理式の結果に応じて 2 つの値のいずれかを取得します。

IIF(expr, truepart, falsepart)
引数 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)"

Note

Expressionプロパティは、null 値または空の文字列を割り当てることでリセットできます。 式列に既定値が設定されている場合、 Expression プロパティがリセットされた後、以前に入力されたすべての行に既定値が割り当てられます。

適用対象

こちらもご覧ください