2009-05-14 11 views
1

2つの異なるObjectDataScourceコントロールにバインドされた2つのAsp.net ListViewコントロールがあります。各ODSコントロールは「MethodA」と「MethodB」を参照します。別のObjectDataSourceに基づいて1つのObjectDataSourceの戻り値を設定する方法

「MethodA」は、データベースを1つ呼び出すだけで、「MethodA」と「MethodB」の両方のデータを返すようにします。

私はいつも 'MethodB'にデータベースの2番目の呼び出しを行うことができますが、それは効率的ではありません。

これを達成するための最良の方法はわかりません。

[DataObjectMethod(DataObjectMethodType.Select)] 
    public List<int> MethodA(int input) 
    { 
     List<int> a = new List<int>(); 
     List<string> b = new List<string>(); 
     /// 
     /// Make one call to database 
     /// returns: List<int> and List<string> 
     /// set 'a' and 'b' values. 

     return a; 
    } 
    [DataObjectMethod(DataObjectMethodType.Select)] 
    public List<string> MethodB() 
    { 
     List<string> b = new List<string>(); 
     /// 
     /// When MethodA is called set 'b' 
     /// 
     return b; 
    } 

答えて

0

これは簡単には可能ではないと思います。

ObjectDatasourceをドロップして、自分自身でロールしたり、ハックすることができます。

多分、そのクラスの[ThreadLocal]静的変数を使用し、MethodAがその変数に値を入れることができますか? MethodBはそれを読むことができた。

そして、あなたのページの開始から

[ThreadLocal] 
    private DataSet m_cachedAtoB=null; 

    public static void Reset() 
    { 
    m_cachedAtoB=null; 
    } 

コールリセット()ASP.NETによってリサイクルされ、各スレッドは次のリクエストのために古い古いデータを残さないように。これがハックだと言いましたか?

改善されたソリューション: これは、MethodBがパラメータをとらないようです。ですから、MethodBが何であっても、MethodAがそれを取得してHttpCacheにプッシュするようにしてください。

私がしたことは、バックエンドですべての静的データを持つWebサーバーに非常に大きな(10テーブル)完全なデータセットをretureすることでした。そこに私はあなたのMehtodAとMehtodBのようなものも持ったクラスを持っていました。しかし、彼らは常にデータセットをフェッチしました。 GetDataSet()はcahceを照会し、欠落している場合はwebserviceを照会してcahceに格納します。私のMethodAメソッドはすべて、LINQを使用して大きなデータセットから要素を取得するだけでした。静的なデータのみで動作します。もちろん、

...

+0

私が使用していたデータは、私は、同じ入力値のために二回、それを計算しないようにしたい、計算するだけで、複雑な大規模ではありません。私はSessionBにMethodBのデータを入れることを考えていました。 – TonyAbell

関連する問題