ITableMetadataCache
ITableMetadataCacheサービスはDataverseのテーブルメタデータへのキャッシュアクセスを提供します。Dataverseから初回アクセス時にテーブルメタデータを取得し、その後のリクエストのためにキャッシュし、サーバーへの繰り返しの往復を避けます。
使用例
ITableMetadataCacheを注入し、テーブルの論理名でGetAsyncを呼び出します。最初の呼び出しはDataverseからメタデータを取得します。その後の呼び出しはキャッシュされた値を返します。
// useTableMetadata は 1 の Mark + Relationship メタデータを取得します
// Dataverseテーブル。同時通話は単一の飛行中で重複除去を行います
// テーブルごとの約束と解決された値はライフタイムに再利用されます
// PowerPortalsProClientの一員です。読み込み中に「データ」が定義されていません。
// テーブルが存在しないとき。
import { useTableMetadata } from '@powerportalspro/react';
function MyComponent() {
const { data: tableMetadata, status } = useTableMetadata('account');
if (status !== 'success' || !tableMetadata) return null;
const { tableName, primaryIdColumn, primaryNameColumn } = tableMetadata;
// ...
}[Inject]
private ITableMetadataCache _tableMetadataCache { get; set; } = null!;
protected override async Task OnInitializedAsync()
{
var tableMetadata = await _tableMetadataCache.GetAsync("account");
if (tableMetadata != null)
{
var tableName = tableMetadata.TableName;
var primaryKey = tableMetadata.PrimaryIdColumn;
var primaryName = tableMetadata.PrimaryNameColumn;
}
}含まれるもの
返却された TableMetadata オブジェクトには以下が含まれます:
Columns— データ型、検証ルール、ラベル、制約を含む列メタデータの集合。PrimaryIdColumn/PrimaryNameColumn— テーブルのプライマリキーおよびプライマリネームカラムの論理名。OneToMany/ManyToOne/ManyToMany— 関連テーブル間のナビゲーションのための関係メタデータ。PrimaryImageColumn— テーブルのプライマリ画像列(存在する場合)の論理名。
列メタデータへのアクセス
Columnsコレクションを使って特定の列のメタデータを調べてください。最大長さ、ターゲットテーブル、オプション値など型固有のプロパティに対して、適切なメタデータタイプ(例:StringMetadata、LookupMetadata、ChoiceMetadata)にキャストします。
const { data: tableMetadata } = useTableMetadata('contact');
// 特定のコラムを調べてみてください。列配列は1つに1つのエントリを持ちます
// Dataverseの列;識別された「タイプ」フィールドで狭く到達する
// 型固有の性質。
const column = tableMetadata?.columns.find((c) => c.columnName === 'firstname');
if (column) {
const isRequired = column.isRequired;
const isValidForUpdate = column.isValidForUpdate;
if (column.type === ColumnType.String) {
const maxLength = column.maxLength;
}
}var tableMetadata = await _tableMetadataCache.GetAsync("contact");
// 特定のコラムを調べてみてください
if (tableMetadata.Columns.TryGetColumn("firstname", out var column))
{
var isRequired = column.IsRequired;
var isValidForUpdate = column.IsValidForUpdate;
// 特定のタイプにキャストして、タイプ固有の性質を使います
if (column is StringMetadata stringMeta)
{
var maxLength = stringMeta.MaxLength;
}
}関係メタデータへのアクセス
OneToMany、ManyToOne、ManyToManyコレクションを使って、関係名で関係メタデータを調べてください。これは、社内でSubGridやManyToManyLookupEditが関連するテーブルを解決しクエリを構築するために使われています。
const { data: tableMetadata } = useTableMetadata('account');
// 一対多の関係を見つけましょう
const oneToMany = tableMetadata?.oneToMany.find(
(x) => x.relationshipName === 'contact_customer_accounts',
);
// 多対多の関係を見つけましょう
const manyToMany = tableMetadata?.manyToMany.find(
(x) => x.relationshipName === 'ppp_Account_ppp_Region_ppp_Region',
);
if (manyToMany) {
const relatedTable = tableMetadata?.tableName === manyToMany.table1
? manyToMany.table2
: manyToMany.table1;
}var tableMetadata = await _tableMetadataCache.GetAsync("account");
// 一対多の関係を見つけましょう
var oneToMany = tableMetadata.OneToMany
.FirstOrDefault(x => x.RelationshipName == "contact_customer_accounts");
// 多対多の関係を見つけましょう
var manyToMany = tableMetadata.ManyToMany
.FirstOrDefault(x => x.RelationshipName == "ppp_Account_ppp_Region_ppp_Region");
if (manyToMany != null)
{
var relatedTable = tableMetadata.TableName == manyToMany.Table1
? manyToMany.Table2
: manyToMany.Table1;
}ヒント
テーブルのメタデータを読むには
ITableMetadataCacheをIPowerPortalsProService.RetrieveTableMetadataAsyncより好みます。キャッシュは冗長なネットワーク呼び出しを避け、すべてのPowerPortalsProコンポーネントで内部的に利用されます。
ITableMetadataCache Interface
方法
名称 | パラメータ | 種類 | 概要 |
|---|---|---|---|
GetAllHeadersAsync | CancellationToken token | Task<IReadOnlyList<TableHeader>> | アイデンティティレベルのメタデータ(論理、スキーマ、表示名、そしていくつかのフラグ)を返します — 環境内の各テーブルに対して、表示名順に並べて。 ITypedCache`2.GetAsync(<U>,System.Threading.CancellationToken) 千のテーブルが埋められると、ドロップダウンはすべての列を取得します。 |
GetAsync | string key CancellationToken token | Task<TableMetadata> | キーでキャッシュからアイテムを取得します。もしアイテムがキャッシュされていない場合は、基底のソースからフェッチされ、キャッシュされて返されます。 |
GetManyAsync | IReadOnlyList<TableMetadataRequest> requests CancellationToken token | Task<IReadOnlyList<TableMetadata>> | 複数のテーブルのメタデータを一度に返し、それぞれが列に絞られます。 関係性、そのリクエスト名。 |
名称:
GetAllHeadersAsyncパラメータ:
CancellationToken token
種類:
Task<IReadOnlyList<TableHeader>>
概要:
アイデンティティレベルのメタデータ(論理、スキーマ、表示名、そしていくつかのフラグ)を返します — 環境内の各テーブルに対して、表示名順に並べて。 テーブルごとのエントリの隣にキャッシュされ、別のパス上に置かれるのではなく、なぜなら 同じ高価なリソースを別の読み方で読むと、テーブルメタデータの取得は重く、 すべての呼び出し元はDataverseを再クエリするのではなく、キャッシュからサービスを受けるべきです。ポピュレーション テーブルピッカーが動機付けの理由の一つです —
ITypedCache`2.GetAsync(<U>,System.Threading.CancellationToken) 千のテーブルが埋められると、ドロップダウンはすべての列を取得します。 名称:
GetAsyncパラメータ:
string key
CancellationToken token
CancellationToken token
種類:
Task<TableMetadata>
概要:
キーでキャッシュからアイテムを取得します。もしアイテムがキャッシュされていない場合は、基底のソースからフェッチされ、キャッシュされて返されます。
名称:
GetManyAsyncパラメータ:
IReadOnlyList<TableMetadataRequest> requests
CancellationToken token
CancellationToken token
種類:
Task<IReadOnlyList<TableMetadata>>
概要:
複数のテーブルのメタデータを一度に返し、それぞれが列に絞られます。 関係性、そのリクエスト名。 上記の二つの中間は、1つのテーブルに対して全テーブル、または すべてのテーブルに対して識別子のみです。これは、少しだけ 多くの中から — テーブルの後ろにあるルックアップ列の表示名 例えば、関係は一つのテーブル上ではなく関連するテーブルに存在します 質問されること。 キャッシュに既に持っているものから切り出したものなので、約30テーブルを尋ねるのは 30回の検索ではなく30回の辞書検索。縮小変更 どの列が戻ってくるか、それぞれが何を運ぶかではなく:名前付き列は次のように到着します。 全テーブルで読んだ通りに詳しく説明しています。 環境に存在しない表は、単に結果から存在しないということです スローよりも — バッチはテーブル名で一致することで読み返しやすいです ポジションを合わせることで。
