2009-05-14 2 views
1

두 개의 다른 ObjectDataScource 컨트롤에 바인딩 된 두 개의 Asp.net ListView 컨트롤이 있습니다. 각 ODS 컨트롤은 'MethodA'와 'MethodB'를 참조합니다.다른 ObjectDataSource를 기반으로 한 ObjectDataSource의 반환 값을 설정하는 방법

'MethodA'는 데이터베이스를 한 번 호출하여 'MethodA'와 'MethodB'둘 다에 대한 데이터를 반환하려고합니다.

나는 항상 'MethodB'가 데이터베이스에 두 번째 호출을 할 수는 있지만 효율적이지는 않습니다.

나는 이것을 수행하는 최선의 방법이 확실하지 않습니다.

[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는 그것을 읽을 수 있습니다.

그리고 ASP.NET에 의해 재활용되는 각 스레드가 다음 요청 된 오래된 데이터를 방치하지 않도록 페이지의 처음부터

[ThreadLocal] 
    private DataSet m_cachedAtoB=null; 

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

전화 리셋(). 나는 이것이 해킹이라고 언급 했는가?

더 나은 해결책 : 매개 변수를 취하지 않는 것처럼 보입니다. 따라서 MethodB 쿼리가 무엇이든 상관없이 MethodA가이를 가져 와서 HttpCache에 넣습니다.

내가 한 것은 백엔드 returend 모든 정적 데이터가 포함 된 웹 서버에 대해 매우 큰 (10 개 테이블) 데이터 세트를 완성한 것입니다. 거기에는 MehtodA와 MehtodB 같은 것들이있는 수업이있었습니다. 그러나 그들은 항상 데이터 세트를 가져 왔습니다. GetDataSet()은 cahce를 쿼리하고 누락 된 경우 webservice를 쿼리하여 cahce에 넣습니다. 모든 MethodA 메소드는 LINQ를 사용하여 큰 데이터 세트에서 물건을 얻습니다.

정적 데이터와 함께 작동 물론

...

+0

내가 사용하고있는 데이터를 그냥 계산하기 복잡 크지 않다, 나는 동일한 입력 값을 두 번 계산하지 않도록합니다. MethodB에 대한 데이터를 Session에 넣을 생각이었습니다. – TonyAbell