FlexPivot for WinForms
フィルタと範囲
C1DataEngineの概要 > C1DataEngine の使用 > フィルタと範囲

フィルタ条件を使用すると、クエリー計算を入力行の一部に限定して適用できます。また、クエリーの目的自体が、何らかのフィルタ条件またはいくつかの列の値範囲に基づいて、基本テーブルまたは別のクエリーの結果から一部の行を選択することである場合もあります。それには、フィルタ条件を使用します。_range と _filter の2種類の条件があります。

フィルタ(_filter) 範囲(_range)
_filter は任意の条件を表すことができ、より汎用的です。ただし、入力行全体をスキャンし、各行で条件をチェックするため、パフォーマンスが低下します。 _range は、DataEngine がすべての行をスキャンする必要がない特別なケースのフィルタなので、パフォーマンスに優れています。

範囲

次のクエリーは、範囲条件を作成する方法を示します。

構文

Dim query4 As dynamic = workspace.query("range", New With { _
        Key ._base = "*", _
        Key ._range = od.UnitPrice.Eq(10) _
})
dynamic query4 = workspace.query("range", new
    {
        _base = "*",
        _range = od.UnitPrice.Eq(10)
    });

上のクエリーは、単価が 10 の OrderDetails 行を選択します。クエリーは、DataEngine によって内部的に作成されたインデックスを使用して、目的の行範囲をスキャンし、他の行をチェックすることなく、単価が 10 の行だけを出力するため、この処理はたいへん効率的です。さらに、1つの列に複数の条件演算を適用することもできます。上のクエリーは、"equals" を表す Eq を使用しています。ほかによく使用される演算には、Gte(以上)、Lte(以下)、Gt(より大きい)、Lt(未満)などがあります。列に適用する条件は、次のように組み合わせることができます。

構文
コードのコピー
_range = od.UnitPrice.Gte(10).Lte(20)

このような「2つの値の間」という条件は _range に適しています。行のスキャンを範囲の先頭から末尾までに制限できるため、やはりパフォーマンスの最適化を図れます。さらに、次のように、複数の列に条件を適用して範囲を指定することもできます。

構文
コードのコピー
_range = od.Discount.Eq(0) + od.UnitPrice.Gte(10).Lte(20)

フィルタ

_range として指定できない条件もあります。 たとえば、"not equal"(Ne)条件は範囲で使用できません。このため、Ne 条件を使用するには、次のように _filter を適用する必要があります。 

構文
コードのコピー
_filter = od.Discount.Ne(0)

DataEngine の条件は、AND だけでなく、OR とも組み合わせることができます。ただし、OR は、次のようにフィルタでのみ使用できます。

構文
コードのコピー
_filter = od.UnitPrice.Lt(10).Or().Gt(20)

And() 演算もあり、次のように、1つのフィルタで OR と AND を組み合わせることができます。

構文
コードのコピー
_filter = od.UnitPrice.Lt(10).Or().Gt(20).And().Lt(30)

上のクエリーは、10 未満または 20 と 30 の間を意味します。

任意の数の Or() と And() を使用し、次のように、+ と組み合わせて複数の列に条件を適用できます。

構文
コードのコピー
_filter = od.Discount.Ne(0) + od.UnitPrice.Lt(10).Or().Gt(20).Or().Gt(30)