「FetchXml を使用したデータのクエリ」で説明されているように、エンティティ要素を使用してテーブルを選択してクエリを開始します。
属性要素を使用して、クエリで返す列を選択します。 例えば次が挙げられます。
<fetch>
<entity name='account'>
<attribute name='accountclassificationcode' />
<attribute name='createdby' />
<attribute name='createdon' />
<attribute name='name' />
</entity>
</fetch>
このクエリは、Account テーブルの最初の 5,000 行の AccountClassificationCode、CreatedBy、CreatedOn、および Name 列を返します。 これよりも多くの行が必要な場合、または小さなデータ セットを反復処理する場合 は、FetchXml を使用して結果をページングする方法について説明します。
返す属性ごとに、 属性要素 を追加し、 name 属性値を列の LogicalName に設定します。
属性要素を使用して、クエリのエンティティの列とlink-entity 要素を使用して結合されたすべてのテーブルを選択します。 FetchXml を使用してテーブルを結合する方法について説明します。
Important
テーブル内のすべての列を返すことを強くお勧めしません。 すべての列を返すと、アプリケーションの実行速度が低下し、タイムアウト エラーが発生する可能性があります。 データで取得する列の最小数を指定する必要があります。 列を指定しない場合、または all-attributes 要素を使用すると、すべての列のデータが返されます。
書式設定された値
返される型指定されたデータは、アプリケーションに表示するのに適していない可能性があります。 書式設定された値は、アプリケーションに表示できる要求と共に返される文字列値です。
最初に書式設定された値を使用 せずに 結果を見てみましょう。 これらの関数は 、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 は、
_createdby_value参照列の GUID 値を持つcreatedbyを返します。
ユーザーフレンドリな値を取得するには、Dataverse から返すことができる 書式設定された値 にアクセスする必要があります。
これらの値を取得する方法は、SDK for .NET と Web API のどちらを使用するかによって異なります。
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;
}
書式設定された値の詳細については、以下を参照してください。
列のエイリアス
列の別名は通常、 集計操作に使用されますが、単純な選択操作でも機能するため、ここではそれらを紹介します。
属性alias属性を使用して、返される結果の一意の列名を指定します。
返される各列には一意の名前が必要です。 既定では、クエリのテーブルに対して返される列名は列 LogicalName 値です。 すべての列論理名はテーブルごとに一意であるため、そのセット内に重複する名前を指定することはできません。
リンク エンティティ要素を使用してテーブルを結合する場合、既定の列名は次の名前付け規則 ({Linked table LogicalName}.{Column LogicalName}) に従います。 これにより、列名の重複が防止されます。 これをオーバーライドするには、一意のエイリアスを使用します。 結合テーブルを表すaliasのlink-entity値を設定することもできます。
列のエイリアスを使用する場合の動作は、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 つのプロパティがあります。
次のステップ
テーブルを結合する方法について説明します。