0

次のコードを検討してください。

function getPersonById(personId, type) {

 var p1 = new breeze.Predicate("Id", "==", personId);    
 var p2 = new breeze.Predicate("Type", "==", type);        
 var query = breeze.EntityQuery.from("Contacts").where(p1.and(p2))

 if (!manager.metadataStore.hasMetadataFor(service.serviceName)) {
      return manager.fetchMetadata().then(function () {
          return manager.executeQuery(query.using(service));
      });
 } else {
      var fromCache = manager.getEntityByKey('Contact', personId);
       if (fromCache)
             return Q.resolve(fromCache);
        return manager.executeQuery(query.using(service));
 }
}
  1. 私は物事を正しい方法で行っていますか? エンティティをフェッチするためだけに、定型コードをたくさん書かなければならないように思えます。メタデータが既知であることを確認し、エンティティが既にキャッシュにあるかどうかを確認する必要がありました。

  2. executeQuery が呼び出されると、戻り値が配列になるため、問題に直面しています。ただし、getEntityByKey が呼び出された場合、戻り値はエンティティです。どうすればエレガントな方法でそれを処理できますか? 配列ではなく単一のエンティティを返すように executeQuery を強制する方法はありますか? (とにかく、返される値は1つだけだと思っています)

4

1 に答える 1

1

クエリごとにメタデータ テストを行う必要はありません。エラー (メタデータがないなど) を処理する fail メソッドを追加する場合、それは 1 回しか記述できませんが、実際には、使用しているサービス タイプの JavaScript ファイルが読み込まれる場合、メタデータは常にそこにあるはずです。データ呼び出しをビュー モデルに移動する場合は、その戦略を再考することをお勧めします。

キャッシュチェックの方法はオプションです。キャッシュからクエリを実行するには、executeQueryLocally と fetchStrategy の設定の 2 つの方法があることに注意してください。サーバーからデータを更新したい場合があるため、各クエリで最初にキャッシュからプルし、必要な場合にのみデータベースにアクセスすることをお勧めします。一般に、エンティティごとにすべてのデータを取得するための方法は 2 つしかありません。クエリは、さまざまな orderBy や where 句などで再利用できる場合に最も効率的です...

最後に、単一のエンティティのみを返したい場合は、他の配列と同じように実行します。返された配列の結果を取得してから送り返し、data.results[0] のようなものに絞り込みます。クエリを実行してからフィルタを使用して、正弦条件を満たす最初のエンティティを見つけることもできます。

于 2013-06-28T14:15:19.277 に答える