FetchXml を使用して列を選択する
FetchXml を使用したデータのクエリで説明したように、クエリを開始するには、エンティティ要素を使用してテーブルを選択します。
属性要素 を使用して、クエリで返す列を選択します。 例:
<fetch>
<entity name='account'>
<attribute name='accountclassificationcode' />
<attribute name='createdby' />
<attribute name='createdon' />
<attribute name='name' />
</entity>
</fetch>
このクエリは、 AccountClassificationCode、CreatedBy、CreatedOn、Name の列を 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)|
----------------------------------------------------------------------------------------------
これらの値は、アプリケーションで表示する必要があるユーザーフレンドリーな値ではない可能性があります。
accountclassificationcode
の選択肢列は整数値を返します。createdby
への SDK 参照は、EntityReference.Name プロパティ を使用する必要があります。- Web APIは、ルックアップ列のGUID値を持つ
_createdby_value
ルックアップ プロパティ を返します。createdby
ユーザーフレンドリーな値を得るには、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として返されます。 OptionSetValue や EntityReference などの複合型の値にアクセスするには、値をキャストする必要があります。
このメソッドは 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クラス には、必要に応じて元の EntityLogicalName と AttributeLogicalName を示す 2 つのプロパティがあります。
次の手順
テーブルの結合方法について説明します。
注意
ドキュメントの言語設定についてお聞かせください。 簡単な調査を行います。 (この調査は英語です)
この調査には約 7 分かかります。 個人データは収集されません (プライバシー ステートメント)。