特定のエンティティをキャッシュまたはリモート サービスから取得する便利な方法として、fetchEntityById を使用します。次に、別のクエリで展開を行う必要があります。リモートに移動して拡張する前に、必要なのがキャッシュされたバージョンで十分かどうかを確認する必要があるため、ほとんどの場合、2 つのステップで実行する必要があります。そのチェックは以下のコードには含まれていませんが、エンティティが部分的なエンティティとしてマークされているか、他の理由で更新が必要なエンティティとしてマークされている場合にのみ更新するようreturn refreshProject(p);
に置き換えるだけです。return p.isPartial() ? refreshProject(p) : projectObservable(p);
もちろん、エンティティを部分的としてマークするロジックを実装する必要があります。
var getProjectById = function (projectId, projectObservable) {
// fetchEntityByKey will look in local cache first (because 3rd
// parm is true) and if not there then it will go remote
return manager.fetchEntityByKey(
'Project', projectId, true)
.then(fetchSucceeded)
.fail(queryFailed);
// Refresh the entity from remote store
function fetchSucceeded(data) {
var p = data.entity;
return refreshProject(p);
}
function refreshProject(project) {
// fromEntities(someEntity) creates a query that gets only someEntity
// from the remote service.
return EntityQuery.fromEntities(project)
.expand('navigationProp1.complexProp1,' +
'navigationProp1.complexProp2,' +
'navigationProp2.complexProp1,' +
'navigationProp2.complexProp2')
.using(manager).execute()
.then(querySucceeded)
.fail(queryFailed);
}
function querySucceeded(data) {
var p = data.results[0];
return projectObservable(p);
}
};
expand
プロジェクトのすべてのコントラクトのリストであるコントラクトなどのナビゲーション プロパティがある場合があるため、この句は非常に興味深いものです。コントラクトに含まれるプリミティブ データ タイプのみを使用して展開できますが.expand('contracts')
、コントラクト タイプにサプライヤなどの 1 つ以上の複雑なプロパティ (さまざまなサプライヤの詳細を含む) がある場合、コントラクトのみを展開すると、サプライヤの Id のみが取り込まれます。のようなプロパティは存在しないため、構文は興味深いものですがcontracts.supplier
、Breeze に との各コントラクトにサプライヤのすべてのプロパティを含めるように指示しますexpand('contracts.supplier')
。