簡易検索 クエリについて

モデル駆動型アプリは、簡易検索 または グリッド検索 を使用してレコードをすばやく検索するエクスペリエンスを提供します。 これらのエクスペリエンスにより、ユーザーは 1 つのテキスト入力を 1 つのテーブル内の複数の列に適用できるようになります。

モデル駆動型アプリは、Dataverse 検索が有効になっている場合、Dataverse 検索 API を使用する検索ボックスも提供します。 Dataverse 検索では、より関連性の高い検索機能を提供するために、結果に複数のテーブルからの結果を含めることができます。 Dataverse 検索が有効でない場合、モデル駆動型アプリは、最大 10 個のクイック検索クエリの結果を組み合わせた、複数テーブルの簡易検索 (分類検索) エクスペリエンスを提供します。 モデル駆動型アプリで利用可能な検索オプションの詳細について解説します。

注意

簡易検索 クエリは、あらゆる状況で使用可能なエクスペリエンスを提供するわけではありません。 詳細: 制限

次のシナリオでは、簡易検索 クエリの代わりに Dataverse 検索 API の使用を検討してください。

簡易検索クエリとは何か?

簡易検索 クエリは次のパターンを使用します:

  1. これらには、「OR」フィルター演算子を使用する単一のフィルターが含まれます。

    追加のフィルターを追加できますが、それらは 簡易検索 フィルター結果が処理された後にのみ評価されます。

  2. 「OR」フィルターは 簡易検索 フィルターとしてマークされます。

  3. フィルターには複数の条件があります。 1 つの条件のみが評価される場合、クエリは通常のクエリとして処理されたときにパフォーマンスが向上します。

  4. フィルター内のすべての条件で「Like」演算子が使用されます。

    「like」演算子には、% で終わる検索文字列が必要です。

    注意

    「Like」演算子は、簡易検索 クエリでサポートされている唯一の演算子です。 簡易検索 クエリがサポートするように設計されているアプリケーション シナリオに必要な唯一の演算子です。 他の演算子はテストされていません。

使用例

簡易検索 クエリの作成方法は、QueryExpression または FetchXml を使用しているかどうかによって異なります。

以下のタブの各例は同じことを行います:

  1. 単一の検索文字列パラメータを受け入れます。 これは、名前、電話番号、電子メール アドレス、またはアカウント番号の一部である可能性があります。

  2. 次のアカウント テーブル列に対して検索文字列をテストする 簡易検索 クエリを作成します。

    • telephone2
    • telephone1
    • emailaddress1
    • accountnumber
    • name
  3. アクティブではないアカウントを除外します。

  4. 結果をアカウント名で並べ替えます。

QueryExpression は Dataverse SDK for .NET で使用できます。

/// <summary>
/// Returns active accounts using quick find filter
/// </summary>
/// <param name="service">The authenticated IOrganizationService instance to use.</param>
/// <param name="searchString">The string to search for</param>
/// <returns>Collection of matching account records</returns>
static EntityCollection QuickFindActiveAccountsQueryExpression(
    IOrganizationService service, 
    string searchString)
{
    // Wildcard required for ConditionOperator.Like
    if (!searchString.EndsWith('%'))
    {
        searchString += '%';
    }

    QueryExpression query = new("account")
    {
        ColumnSet = new("accountid",
                        "name",
                        "accountnumber",
                        "primarycontactid",
                        "address1_city",
                        "telephone1",
                        "emailaddress1"),
        Criteria = new()
        {
            Filters =
            {
                new (LogicalOperator.Or)
                {    
                    // Specify Quick find filter
                    IsQuickFindFilter = true,
                    Conditions =
                    {
                        { new (attributeName: "telephone2", 
                            ConditionOperator.Like, 
                            value: searchString) },
                        { new (attributeName: "telephone1", 
                            ConditionOperator.Like, 
                            value: searchString) },
                        { new (attributeName: "emailaddress1", 
                            ConditionOperator.Like, 
                            value: searchString) },
                        { new (attributeName: "accountnumber", 
                            ConditionOperator.Like,
                            value: searchString) },
                        { new (attributeName: "name", 
                            ConditionOperator.Like,
                            value: searchString) }
                    }
                },
                // Condition to be evaluated after Quick find filter
                new (LogicalOperator.And)
                {
                     Conditions =
                    {
                        {new(attributeName:"statecode",
                            ConditionOperator.Equal, 
                            value: 0)}
                    }
                }
            }
        },
        Orders = {
            {
                new(attributeName: "name", 
                    orderType: OrderType.Ascending)
            }
        }
    };

    return service.RetrieveMultiple(query);
}

簡易検索レコード上限

Power Platform 管理センター内には、 簡易検索 レコード制限 と呼ばれる Dataverse 設定 があります。これは規定でオンになっています。 この設定は organization table QuickFindRecordLimitEnabled 列 が格納します。

重要

簡易検索 レコード制限 設定を有効のままにすることを強くお勧めします。 この設定により、簡易検索 クエリが利用可能なリソースを使い果たした場合に、システムの速度低下や潜在的なサービス中断から保護されます。

簡易検索 クエリはアプリケーションの特定のユーザー エクスペリエンスをサポートするため、結果を返さなければすぐに失敗します。 ユーザーは結果が出るまで長時間待機することはなく、これらのクエリはテーブルの複数の列に条件を設定できるため、大量のシステム リソースを使用する可能性があります。

簡易検索 レコード制限 設定が有効になっている場合、結果の数が 10,000 行を超えると、簡易検索 クエリはエラーを返します。 返されるエラー:

名前: QuickFindQueryRecordLimitExceeded
コード: 0x8004E024
番号: -2147164124
メッセージ: The number of records for this search exceeds the Quick Search record limit. Please refine your query and try again.

このエラーをアプリケーションで表示する必要はありませんが、発生する可能性があることを想定しておく必要があります。 これは次の方法で軽減できます:

  • クエリによって検索されるフィールドの数を制限します。
  • クエリに制限条件を含めます。
  • 一致する合計数を減らすには、ユーザーが検索ボックスにより多くの文字を入力するように要求します。

クエリが成功するかどうかは、クエリの定義方法よりもテーブル内のレコードの数に依存する場合があります。 これを理解するには、検索項目の制限がどのように計算されるかを理解する必要があります。

検索アイテム制限の計算方法

検索項目の上限は、簡易検索フィルターの項目のみを使用して計算されます。 クエリを処理する際、Dataverse は簡易検索フィルターがあるかどうかを検出し、セキュリティ フィルターを適用する前であっても それを最初に処理します。 簡易検索フィルターの結果が 10,000 行を超えた場合、Dataverse は QuickFindQueryRecordLimitExceeded 例外をスローし、他のフィルターは処理されません。 返されるレコードの総数を少なくするためにフィルターを追加しても、QuickFindQueryRecordLimitExceeded 例外の可能性は減少しません。 一致するレコードをすべて表示する権限を持たずにテーブルをクエリすると、このエラーが発生する可能性があります。

クイック検索レコードの制限を回避

簡易検索レコード制限 の設定が有効で、一時的に簡易検索制限を超えるクエリをテストする必要がある場合、FetchXml を使用してクエリを作成し、フィルター要素overridequickfindrecordlimitdisabled 属性を '1' に設定します。

クイック検索レコードの制限を適用

簡易検索レコード制限 の設定が無効で、一時的に制限付きのクエリをテストする必要がある場合、FetchXml を使用してクエリを作成し、フィルター要素overridequickfindrecordlimitenabled 属性を '1' に設定します。

制限

簡易検索 クエリは、あらゆる状況で使用可能なエクスペリエンスを提供するわけではありません。

検索項目の制限はセキュリティ フィルターを適用する前に計算されるため、テーブルに多数のレコードが含まれている場合、呼び出し側ユーザーが表示するセキュリティ権限を持っているレコードの数に関係なく、システム内の一致するレコードの総数は 10,000 レコードの制限を超える可能性があります。 クエリを絞り込んだり、より具体的な検索条件を使用したりするだけでは、ユーザーに使いやすいエクスペリエンスを提供するには不十分な場合があります。

最悪のシナリオでは、非常に具体的な検索文字列を入力しない限り、QuickFindQueryRecordLimitExceeded 例外が表示され、期待される「簡易検索」エクスペリエンスが提供されません。

関連情報

FetchXML を使用してデータのクエリを実行する
QueryExpression でクエリを作成する
Dataverse 検索 APIs