VLV を使用して検索する方法

Active Directory は、仮想リストビュー (VLV) 検索をサポートしています。 このスタイルの検索は、大規模な結果セット向けに設計されており、アプリケーションでは、各エントリを実際に取得する必要がなく、何千ものエントリのサブセットを表示できます。

VLV 検索を使用できる方法は2つあります。 1つ目は、数値オフセットに基づいて特定のエントリの属性を取得することです。 このメソッドは、スクロール操作に応答して検索結果を取得する場合に便利です。

VLV 検索を使用する2番目の方法は、テキスト属性の一部またはすべてを検索し、検索結果のみを表示することです。 この例の使用例は、アドレス帳です。 ユーザーが "s" を入力すると、アプリケーションは VLV 検索を使用して、"s" で始まる共通名を持つエントリを検索できます。 その後、ユーザーが "m" を "s" に追加すると、アプリケーションは別の VLV 検索を使用して、"sm" で始まる共通名を持つエントリを検索できます。

VLV 検索を実行するには、VLV に VLV コントロールを使用するように指示します。 これを行うには、 Adstype _ PROV _ 固有 の値を指定した ADS _ SEARCHPREF _ VLV 検索オプションを使用して、 idirectorysearch:: setsearchpreferenceメソッドを呼び出します。 Adstype _ PROV _ 固有 の値は、検索に関するデータを格納する ADS _ VLV構造体へのポインターです。 GetVLVItemCount example 関数は、これらの両方の検索設定を設定する方法を示しています。

すべての VLV 検索では、サーバー側の結果の並べ替えを使用する必要があります。これは、 広告 _ SEARCHPREF _ SORT _ ON search の設定によって実行されます。 広告 _ SEARCHPREF _ SORT _ ON search の設定の詳細については、「 Idirectorysearch を使用した検索結果の並べ替え」を参照してください。

VLV 検索を実行すると、検索に関する特定の量のメタデータが、 ADS の _ vlv _ 応答 識別子を使用して Idirectorysearch:: getcolumnを呼び出すことによって取得される列に返されます。 このデータは、ADS の _ VLV 構造体に含まれています。 特に重要なのは、 DwcontentcountlpContextID のメンバーです。 Dwcontentcount メンバーには、VLV 検索条件に一致する結果の数が含まれます。 この値は、その型の検索に対して返される項目の合計数の見積もりとして使用できます。 LpContextID メンバーには、検索を識別するために次の検索に渡すことができるサーバー定義値が含まれています。 LpContextID を使用すると、検索のパフォーマンスを向上させることができます。 LpContextID はサーバー定義の値であり、その長さが dwContextIDLength メンバーに含まれていることに注意してください。 このバッファーは、 Idirectorysearch:: freecolumn のメソッドが呼び出されたときに解放されるため、呼び出し元は適切なサイズのバッファーを割り当て、検索の間にバッファーの内容をコピーして保存する必要があります。

LDAP VLV コントロールの詳細については、「 LDAP Vlv コントロールを使用した検索」を参照してください。

詳細については、次を参照してください。

項目数の取得

特定の検索に対して返される項目の数の見積もりを取得するには、次の手順を実行します。

  1. すべてのゼロ値または NULL 値を使用して、広告の _ VLV構造体を入力します。

  2. ADS _ SEARCHPREF _ INFOに次の値を入力します。

    • DwSearchPref メンバーを ADS _ SEARCHPREF _ VLV に設定します。
    • Vvalue メンバーを adstype _ PROV _ 固有 に設定します。
    • Vvalue. Providerspecific メンバーに ADS _ VLV構造体のサイズを設定します。
    • 手順 1. で指定した ADS の _ VLV構造体のアドレスに、 Vvalue. providerspecific のメンバーを設定します。
  3. IDirectorySearch を使用して検索結果を並べ替える」に示されているように、広告の _ SORTKEY構造を入力して、目的の属性を並べ替えます。

  4. IDirectorySearch を使用して検索結果を並べ替える」に示されているように、別の ads _ SEARCHPREF _ INFOを入力して、広告の _ SORTKEY構造を検索設定に追加します。

  5. その他の必要な検索設定を追加し、 Idirectorysearch:: SetSearchPreference を呼び出して検索設定を設定します。

  6. Idirectorysearch:: executesearchを使用して検索を実行します。

  7. Idirectorysearch:: GetFirstRowを呼び出して、結果の最初の行を取得します。

  8. Vlv を使用して Idirectorysearch:: GetColumnを呼び出し、vlv 検索メタデータを取得します。 _ _

  9. Ads _ 検索 _ 列構造の Padsvalues->providerspecific の lpvalue広告の _ VLV構造体ポインターにキャストします。 この ADS _ VLV 構造体の dwcontentcount メンバーには、その型の検索によって返される項目の概数が含まれています。

  10. 同じ種類の他の VLV 検索を実行する場合は、 lpContextID データのコピーを作成し、次の vlv 検索用に保持します。

GetVLVItemCount example 関数は、これを行う方法を示しています。

オフセットによる検索

VLV 検索を簡単に行う1つの方法は、数値オフセットで特定の結果を検索できることです。 たとえば、検索結果として1万項目が返される場合、VLV 検索を使用すると、対象項目の前にあるすべての項目を取得しなくても、約 40 72 番目の項目の情報を取得できます。

オフセットは、オフセットとコンテンツ数の比率として指定されます。 サーバーの一覧に存在するエントリの数が正確に推定されない場合や、ユーザーが参照している間にリストのサイズが変更される場合があるので、比率が役立ちます。 リストの先頭と末尾を指定する必要があるため、最初の検索要求のコンテンツ数にはオフセット値を使用できます。 サーバーは、このデータを使用して、コンテンツ数の概念に基づいてリスト内の対応するオフセットを計算します。これは、 ADS の _ VLV構造体の dwcontentcount メンバーを介してクライアントに応答して送信されます。 たとえば、リストのサイズを3000と推定し、オフセットをリストエントリ1500にする場合は、 Dwcontentcount を3000に、 dwoffset を1500に設定します。 サーバーで実際のリストサイズが4500であると推定される場合は、オフセットを2250に再計算し、 Dwcontentcountdwoffset の新しい推定値を返します。

注意

VLV 検索のすべての数値は概数であるため、絶対値には使用できません。 たとえば、100の50番目項目に対して VLV 検索を発行した場合、正確な中間項目を取得することは保証されません。

オフセットで特定の項目を検索するには、次の手順を実行します。

  1. 次の値を使用して、 広告の _ VLV 構造体を入力します。 構造体のその他のメンバーは、0または NULL に設定する必要があります。

    • Dwcontentcount メンバーを取得する項目の比率の最大値に設定します。
    • Dwoffset メンバーを、取得する項目の dwcontentcount を基準とした比率に設定します。
    • LpContextID メンバーをコンテキスト id バッファーのコピーのアドレスに設定し、 DWCONTEXTIDLENGTH をコンテキスト id バッファーの長さ (バイト単位) に設定します。 コンテキスト ID が保存されていない場合は、これらのメンバーの両方が0または NULL である必要があります。
  2. 「項目数を取得する」の手順 2 ~ 5 に示すように、検索の設定を設定します。

  3. Idirectorysearch:: executesearchを使用して検索を実行します。

  4. Idirectorysearch:: GetFirstRowを呼び出して、結果の最初の行を取得します。

  5. 取得する属性の名前を指定して Idirectorysearch:: GetColumn を呼び出し、要求された項目の実際のデータを取得します。

  6. Vlv を使用して Idirectorysearch:: GetColumnを呼び出し、vlv 検索メタデータを取得します。 _ _

  7. Ads _ 検索 _ 列構造の Padsvalues->providerspecific の lpvalue広告の _ VLV構造体ポインターにキャストします。

  8. LpContextID データのコピーを作成し、次の VLV 検索用に保持します。

 

GetVLVItemText example 関数は、これを行う方法を示しています。

また、1つの検索呼び出しで複数行のデータを取得することもできます。 これを行うには、手順 1. で、 ADS の _ VLV構造体の DwBeforeCount メンバーと dwaftercount メンバーを適切に設定します。 DwBeforeCount メンバーには、問題の項目の前にリストに表示される項目の数が含まれます。 dwaftercount メンバーには、対象の項目の後に一覧に表示される項目の数が含まれます。 これらのカウントによって項目自体が除外されるため、 dwBeforeCount を10に設定し、 dwaftercount を10に設定すると、合計で21個の項目が返されます。 このオプションを使用すると、クライアント側で検索結果をキャッシュできます。

検索 (文字列で)

また、VLV 検索を使用して、すべての項目を取得せずに、文字列の全体または一部に一致する値を持つ文字列属性を持つ項目を検索することもできます。 文字列照合は、 ads _ SEARCHPREF _ SORT _ ON search 設定の ads _ SORTKEY構造体で指定された属性に対して実行されます。

文字列で特定の項目を検索するには、次の手順を実行します。

  1. 次の値を使用して、 広告の _ VLV 構造体を入力します。 構造体のその他のメンバーは、0または NULL に設定する必要があります。

    • Psztarget メンバーを、検索対象の文字列を含む NULL で終わる文字列へのポインターに設定します。
    • LpContextID メンバーをコンテキスト id バッファーのコピーのアドレスに設定し、 DWCONTEXTIDLENGTH をコンテキスト id バッファーの長さ (バイト単位) に設定します。 コンテキスト ID が保存されていない場合は、これらのメンバーの両方が0または NULL である必要があります。
  2. 「項目数を取得する」の手順 2 ~ 5 に示すように、検索の設定を設定します。

  3. Idirectorysearch:: executesearchを使用して検索を実行します。

  4. Idirectorysearch:: GetFirstRowを呼び出して、結果の最初の行を取得します。

  5. 取得する属性の名前を指定して Idirectorysearch:: GetColumn を呼び出し、要求された項目の実際のデータを取得します。

  6. Vlv を使用して Idirectorysearch:: GetColumnを呼び出し、vlv 検索メタデータを取得します。 _ _

  7. Ads _ 検索 _ 列構造の Padsvalues->providerspecific の lpvalue広告の _ VLV構造体ポインターにキャストします。

  8. LpContextID データのコピーを作成し、次の VLV 検索用に保持します。 必要に応じて、 Dwoffset メンバーには、文字列属性が psztarget に指定された値で始まる最初の項目の1から始まるインデックスが含まれます。

GetVLVItemsByString example 関数は、これを行う方法を示しています。

インデックスで検索するのと同様に、単一の検索呼び出しで複数行のデータを取得することもできます。 これは、 ADS の _ VLV構造体の DwBeforeCount メンバーと dwaftercount メンバーを適切に設定することによって、同じ方法で実現されます。