2011-07-13 10 views
1

開発中のRIAサービスアプリケーションがあります。サーバーサイドページングとページング項目の問題がDataGridに表示されています。私はPageIndexPageSizeがいくつかのフィルタパラメータと共にQuery経由で渡されるカスタムDomainServiceを使用しています。DomainCollectionViewとカスタムDomainServiceでページ項目が正しく表示されない

問題の最初のページが正しく表示されますが、次の結果セットにページを移動すると、サーバーから返された新しい結果を表示するのではなく、アイテムがリストの最後に追加されます。つまり、DataGridは返された最新の結果ページを表示するのではなく、サーバーから返されたすべての累積オブジェクトを表示しています。

まず、私はDomainCollectionViewとDomainCollectionViewLoaderを使用しています:その後、私は(かなり標準的な負荷を持って


_context = new StudyQueryContext(); 
_entityList = new EntityList(_context.PortalStudies); 
_loader = new DomainCollectionViewLoader(Load, LoadComplete); 
PortalStudies = new DomainCollectionView(_loader, _context.PortalStudies);  

)とLoadComplete()メソッド:私はTotalItemCountを割り当てる


public LoadOperation Load() 
{ 
    if (IsLoading) 
    { 
     return null; 
    } 

    IsLoading = true; 
    EntityQuery q = _context.GetPortalStudyQuery(PatientsName, PatientId, AccessionNumber, PortalStudies.PageIndex, PortalStudies.PageSize);   
    return _context.Load(q); 
} 

private void LoadComplete(LoadOperation op) 
{ 
    if (op.HasError) 
    { 
     System.Windows.MessageBox.Show(op.Error.ToString(), "Search Error", System.Windows.MessageBoxButton.OK); 
     op.MarkErrorAsHandled(); 
    } 
    else if (!op.IsCanceled) 
    { 
     _entityList.Source = op.Entities; 
     _context.PortalCountAll(PatientsName, PatientId, AccessionNumber, CountAllComplete, null); 
    } 

    IsLoading = false; 
} 

注意PortalCountAllメソッドが戻ります。

ただ、完全酒のために、私のDomainServiceクエリメソッドのシグネチャは以下の通りです:


[Query] 
public IEnumerable&ltPortalStudy> GetPortalStudy(string patientsName, string patientId, string accessionNumber, int startIndex, int pageSize) 
{ } 

私は、問題は私が_entityListを設定していどのようにして中に結果を代入していると仮定したいですLoadComplete()メソッド:

_entityList.Source = op.Entities; 

すべてのLINQベースの例において、この割り当ては、データグリッドに表示されるだけ現在の結果を可能にするように思われると思われます。何らかの理由で、これはカスタムクエリメソッドを使用している場合には当てはまりません。

ページを変更したときにDataGridを消去する方法は何ですか?私はクエリを実行する前に_context.PortalStudies.Clear()を呼び出すだけで結果をクリアすることができますが、この結果、アイテムがクリアされたページでフラッシュが発生し、クエリがサーバーから返されるまで再度ポピュレートされません。カスタムDomainServiceを使用しているときに結果の現在のページだけを表示する適切な方法は何ですか?

+0

RIAサービスとIEnumerableの主なセールスポイントは、結果のLINQが処理のためにサーバーにシリアル化されるときに、フィルターとページング*クライアント側*を追加することです。 通常、ページインデックスとページサイズをパラメータとして渡す必要はありません。手動でページングを行う理由を明確にすることはできますか? –

+0

私の検索結果セットには何万もの結果があるかもしれないので、クライアントでの検索結果をすべて読み込むのではなく、サーバー側のページングをしたいと思います。 RIAサービスのドキュメントから、LINQを使用する場合、クエリでSkip()およびTake()を使用してサーバーサイドページングを実行できることが明らかです。私は自家製のORMを使用しており、インターフェイスとしてLINQを使用することはできません。したがって、最も簡単な実装は、サーバー側のページングを行うために、PageSizeとPageIndexを直接クエリに渡すことです。 –

+0

LINQサーバー側を使用できない場合、はい、深刻な問題があります。 SilverlightのすべてのクールなものはLINQを前提としています。 EFのためにORMを投棄する可能性はありますか? –

答えて

1

LINQをサポートしていないカスタムORMで作業する場合、PageIndexとPageSizeを渡すことができます(また、そうする必要があります)。 ORMに対してページングすることができますが、ページングは​​やや複雑になります。 override DomainService.Countまたはadd a totalCount out parameterにする必要があります。

しかし、あなたのEntitySet(_context.PortalStudies)をEntityList(_entityList)の代わりにDCVコンストラクタに渡したというバグのようです。

+0

カイル - 応答をありがとう、これは私の問題を解決! _entityListがDCVで使用されていたはずであることに気付かずに、私は今や愚かではないと感じています。また、totalCount outパラメータのヒントをいただきありがとうございました。私は合計カウントを取得するためにサーバーへの別のラウンドトリップを行っていましたが、このように行うことはできませんでした。カスタムORMでRIAを使用する際に多くの質問が出るようには思われません。うまくいけば、他の人が早くスピードアップするのに役立ちます。 –

関連する問題