2012-03-21 10 views
0

RIAサービスを使用してリモートデータベースからdtaaを表示している単純なSilverlight Webページがあります。私はDomainContextを持っており、そこではデータベースを介してクエリを実行します。RIAサービスを使用したDomainContextのバッチクエリ

context.Load(context.GetSitesQuery()).Completed += new EventHandler(Query_Completed); 

私はクエリが完了するのを聞いていることに注意してください。ここで問題となるのは、少なくとも20の異なるクエリを作成する必要があることです。クエリごとに異なるエンティティオブジェクトが関係します。すべてのデータがロードされるまで、アプリケーションは本当に多くを処理することができません。だから、私は本当にすべてのクエリが終了したときに知りたいです。クエリのバッチを作成する簡単な方法はありますか?

私はこれを自分で試しましたが、それぞれのクエリに別のエンティティが含まれているため、問題が発生しました。私はEntityQuery<Entity>のリストを作成し、それを反復してすべてのクエリを実行することができたと考えましたが、Loadメソッドは間違ったパラメータを持つことについて不平を言うか、実行時に失敗します。

答えて

0

私たちは、保留中のロード操作の数を追跡することによって、あなたがすることを達成しました。それが0に達すると、効果的に実行されます。

using System.ServiceModel.DomainServices.Client; 

... 

private int _loadCounter; 
private TheDomainContext _domainContext; 

private void Load<TEntity>(EntityQuery<TEntity> query, 
          Action<LoadOperation<TEntity>> callback) 
         where TEntity : Entity 
{ 
    BeginLoading(); 
    Action<LoadOperation<TEntity>> internalCallback = 
      loadOp => { 
          callback(loadOP); 
          EndLoading(); 
         }; 
    _domainContext.Load(query, internalCallback , null); 
} 

private void BeginLoading() 
{ 
    _loadCounter++; 
    // You could add logic to indicate the app is busy 
} 

private void EndLoading() 
{ 
    _loadCounter--; 
    if (_loadCounter == 0) 
    { 
     OnLoadComplete(); 
    } 
} 

private void OnLoadComplete() 
{ 
    // TODO Everything is loaded 
} 

private void BeginLoadingTheQueries() 
{ 
    // Increment once here to prevent the OnLoadComplete from occurring 
    // before all queries have started 
    BeginLoading(); 
    Load(_domainContext.GetSitesQuery(), Query_Completed); 
    Load(_domainContext.GetOtherQuery(), OtherQuery_Completed); 
    EndLoading(); 
} 
+0

「TEntity」への参照はどのように取得されますか? (C#タグを付けてくれてありがとう) –

+0

私は 'where TEntity:Entity'と必要な' using'ステートメントを追加しました。 –

+0

ありがとうございます。これは基本的に私がすでに持っていたものです。私はそれをするより良い方法があることを望んでいましたが、これは問題ありません。 –

関連する問題