FetchXml を使用して列を選択する

FetchXml を使用したデータのクエリで説明したように、クエリを開始するには、エンティティ要素を使用してテーブルを選択します。

属性要素 を使用して、クエリで返す列を選択します。 例:

<fetch>
  <entity name='account'>
    <attribute name='accountclassificationcode' />
    <attribute name='createdby' />
    <attribute name='createdon' />
    <attribute name='name' />
  </entity>
</fetch>

このクエリは、 AccountClassificationCodeCreatedByCreatedOnName の列を Accountテーブルの最初の 5,000 行から返します。 これより多くの行が必要な場合や、より小さなデータセットを繰り返し処理したい場合は、FetchXml を使用して結果をページ表示する方法を学んでください

返したい属性ごとに、属性要素 を追加し、name 属性値を列の LogicalName に設定します。

属性要素を使用して、クエリのエンティティおよび リンク エンティティ 要素を使用して結合されたテーブルの列を選択します。 FetchXml を使用してテーブルを結合する方法

重要

テーブル内のすべての列を返すことは強くお勧めしません。 すべての列を返すと、アプリケーションの実行が遅くなり、タイムアウト エラーが発生する可能性があります。 データとともに取得する列の最小数を指定する必要があります。 列を指定しない場合、または すべての属性要素、すべての列のデータが返されます。

書式設定された値

返された型指定されたデータは、アプリケーションでの表示に適していない可能性があります。 フォーマットされた値は、アプリケーションで表示できるリクエストとともに返される文字列値です。

まず、フォーマットされた値を使用しない場合の結果を見てみましょう。 これらの関数は ConsoleTables NuGet パッケージ を使用して、コンソール アプリケーションでテーブルを表示します。

この SimpleOutput メソッドは、Entity.Attributes コレクション内の値にのみアクセスします。

/// <summary>
/// Output the entity attribute values
/// </summary>
/// <param name="service">The authenticated IOrganizationService instance</param>
static void SimpleOutput(IOrganizationService service) {

    string fetchXml = @"<fetch>
            <entity name='account'>
                <attribute name='accountclassificationcode' />
                <attribute name='createdby' />
                <attribute name='createdon' />
                <attribute name='name' />
            </entity>
            </fetch>";

    FetchExpression fetchExpression = new(fetchXml);

    //Retrieve the data
    EntityCollection entityCollection = service.RetrieveMultiple(query: fetchExpression);

    var table = new ConsoleTables.ConsoleTable("classificationcode", "createdby", "createdon", "name");

    foreach (var entity in entityCollection.Entities ) {

        var accountclassificationcode = entity.GetAttributeValue<OptionSetValue>("accountclassificationcode").Value;
        var createdby = entity.GetAttributeValue<EntityReference>("createdby").Name;
        var createdon = entity.GetAttributeValue<DateTime>("createdon");
        var name = entity.GetAttributeValue<string>("name");

        table.AddRow(accountclassificationcode, createdby, createdon, name);

    }
    table.Write();
}

出力:

 ----------------------------------------------------------------------------------------------
 | classificationcode | createdby           | createdon             | name                    |
 ----------------------------------------------------------------------------------------------
 | 1                  | FirstName LastName  | 8/13/2023 10:30:08 PM | Fourth Coffee (sample)  |
 ----------------------------------------------------------------------------------------------
 | 1                  | FirstName LastName  | 8/13/2023 10:30:10 PM | Litware, Inc. (sample)  |
 ----------------------------------------------------------------------------------------------
 | 1                  | FirstName LastName  | 8/13/2023 10:30:10 PM | Adventure Works (sample)|
 ----------------------------------------------------------------------------------------------

これらの値は、アプリケーションで表示する必要があるユーザーフレンドリーな値ではない可能性があります。

ユーザーフレンドリーな値を得るには、Dataverse で返せるフォーマットされた値にアクセスする必要があります。

これらの値をどのように取得するかは、SDK for .NET または Web API のどちらを使用するかによって異なります。

FetchXml Sample コードで説明した OutputFetchRequest サンプルメソッドでは、Entity.FormattedValuesコレクションのデータを使用しているので、クエリの結果は次のようになります:

 --------------------------------------------------------------------------------------------------
 | accountclassificationcode | createdby           | createdon          | name                    |
 --------------------------------------------------------------------------------------------------
 | Default Value             | FirstName LastName  | 8/13/2023 10:30 PM | Fourth Coffee (sample)  |
 --------------------------------------------------------------------------------------------------
 | Default Value             | FirstName LastName  | 8/13/2023 10:30 PM | Litware, Inc. (sample)  |
 --------------------------------------------------------------------------------------------------
 | Default Value             | FirstName LastName  | 8/13/2023 10:30 PM | Adventure Works (sample)|
 --------------------------------------------------------------------------------------------------

この GetRowValues メソッドは、Entity.FormattedValues からレコードの文字列値のリストを抽出します。

/// <summary>
/// Returns the values of a row as strings
/// </summary>
/// <param name="columns">The names of the columns</param>
/// <param name="entity">The entity with the data</param>
/// <returns></returns>
static List<string> GetRowValues(List<string> columns, Entity entity)
{
   List<string> values = new();
   columns.ForEach(column =>
   {
      if (entity.Attributes.ContainsKey(column))
      {
            // Use the formatted value if it available
            if (entity.FormattedValues.ContainsKey(column) &&
            !string.IsNullOrWhiteSpace(entity.FormattedValues[column]))
            {
               values.Add($"{entity.FormattedValues[column]}");
            }
            else
            {
               // When an alias is used, the Aliased value must be converted
               if (entity.Attributes[column] is AliasedValue aliasedValue)
               {
                  // When an EntityReference doesn't have a Name, show the Id
                  if (aliasedValue.Value is EntityReference lookup &&
                  string.IsNullOrWhiteSpace(lookup.Name))
                  {
                        values.Add($"{lookup.Id:B}");
                  }
                  else
                  {
                        values.Add($"{aliasedValue.Value}");
                  }
               }
               else
               {
                  // Use the simple attribute value
                  values.Add($"{entity.Attributes[column]}");
               }
            }
      }
      // Null values are not in the Attributes collection
      else
      {
            values.Add("NULL");
      }

   });
   return values;
}

フォーマットされた値について詳しくは、次をご覧ください:

列の別名

列エイリアスは通常 集計操作に使用されますが、単純な選択操作でも機能するため、こちらで紹介します。

attribute alias 属性を使用して、返される結果の一意の列名を指定します。

返される各列は一意な名前でなければなりません。 規定では、クエリのテーブルに対して返される列名は、列 LogicalName の値です。 すべての列の論理名はテーブルごとに一意であるため、そのセット内で重複する名前は存在できません。

リンク エンティティ要素テーブルに結合 する場合、既定の列名は次の命名規則に従います: {Linked table LogicalName}.{Column LogicalName}。 これにより、列名の重複が防止されます。 これは、一意のエイリアスを使用して上書きできます。 また、結合されたテーブルを表す link-entity に対して alias 値を設定することもできます。

列のエイリアスを使用する際の動作は、SDK for .NET と Web API のどちらを使用しているかによって異なります。

この SimpleAliasOutput メソッドでは、列の論理名ではなくエイリアスを使用します。 このため、結果は AliasedValueとして返されます。 OptionSetValueEntityReference などの複合型の値にアクセスするには、値をキャストする必要があります。

このメソッドは ConsoleTables NuGet パッケージ を使用します。

/// <summary>
/// Output the entity attribute values with aliases
/// </summary>
/// <param name="service">The authenticated IOrganizaitonService instance</param>
static void SimpleAliasOutput(IOrganizationService service)
{
    string fetchXml = @"<fetch top='3'>
            <entity name='account'>
              <attribute name='accountclassificationcode' alias='code' />
              <attribute name='createdby' alias='whocreated' />
              <attribute name='createdon' alias='whencreated' />
              <attribute name='name' alias='companyname' />
            </entity>
          </fetch>";

    FetchExpression fetchExpression = new(fetchXml);

    //Retrieve the data
    EntityCollection entityCollection = service.RetrieveMultiple(query: fetchExpression);

    var table = new ConsoleTables.ConsoleTable("code", "whocreated", "whencreated", "companyname");

    foreach (var entity in entityCollection.Entities)
    {

        var code = ((OptionSetValue)entity.GetAttributeValue<AliasedValue>("code").Value).Value;
        var whocreated = ((EntityReference)entity.GetAttributeValue<AliasedValue>("whocreated").Value).Name;
        var whencreated = entity.GetAttributeValue<AliasedValue>("whencreated").Value;
        var companyname = entity.GetAttributeValue<AliasedValue>("companyname").Value;

        table.AddRow(code, whocreated, createdon, companyname);

    }
    table.Write();
}

出力:

 ----------------------------------------------------------------------------------
 | code | whocreated           | whencreated           | companyname              |
 ----------------------------------------------------------------------------------
 | 1    | FirstName LastName   | 8/13/2023 10:30:08 PM | Fourth Coffee (sample)   |
 ----------------------------------------------------------------------------------
 | 1    | FirstName LastName   | 8/13/2023 10:30:10 PM | Litware, Inc. (sample)   |
 ----------------------------------------------------------------------------------
 | 1    | FirstName LastName   | 8/13/2023 10:30:10 PM | Adventure Works (sample) |
 ----------------------------------------------------------------------------------

注意

AliasedValueクラス には、必要に応じて元の EntityLogicalNameAttributeLogicalName を示す 2 つのプロパティがあります。

次の手順

テーブルの結合方法について説明します。

注意

ドキュメントの言語設定についてお聞かせください。 簡単な調査を行います。 (この調査は英語です)

この調査には約 7 分かかります。 個人データは収集されません (プライバシー ステートメント)。