1

我有两个 Asp.net ListView 控件绑定到两个不同的 ObjectDataSource 控件。每个 ODS 控件引用“MethodA”和“MethodB”。

我希望“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;
    }
4

1 回答 1

0

我认为这不容易。

您可以删除 ObjectDatasource 并自行滚动它或绕过它。

也许在该类中使用 [ThreadLocal] 静态变量并让 MethodA 将值放入该变量中?MethodB 可以读取它。

还有一个

  [ThreadLocal]
  private DataSet m_cachedAtoB=null;

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

从页面的开头调用 Reset() 以便 ASP.NET 回收的每个线程不会为下一个请求留下旧的陈旧数据。我有没有提到这是一个黑客?

更好的解决方案:似乎 MethodB 不带参数。因此,无论 MethodB 查询的是什么,让 MethodA 获取它并将其推送到 HttpCache 中。

我所做的是,我的后端将一个相当大(10 个表)的完整数据集返回给包含所有静态数据的网络服务器。在那里我有一堂课,里面也有你的 MehtodA 和 MehtodB 之类的东西。但他们总是获取数据集。GetDataSet() 查询了 cahce,如果它丢失了,则查询 web 服务并将其放入 cahce。我的每个 MethodA 方法都只是使用 LINQ 从大数据集中获取内容。

当然,这只适用于静态数据......

于 2009-05-14T22:36:12.667 回答