提高嵌套对象的过滤速度

时间:2012-10-05 19:52:02

标签: c# asp.net performance c#-4.0 webforms

这是我遇到的问题(简化示例): 假设我有几张桌子: enter image description here

一个客户可以拥有mamy产品,而一个产品可以拥有多种功能。

在我的asp.net前端,我有一个包含客户信息的网格:

类似的东西:

Name   Address   
John   222 1st st     
Mark   111 2nd st 

我需要的是按功能过滤客户的能力。因此,我有一个连接到客户的可用功能的下拉列表。

我目前的做法:
1.我从存储过程返回DataTable个客户。我把它存放在viewstate中 2.我从存储过程返回与客户连接的DataTable个功能。我将它存储在viewstate中 3.在选择的过滤器上,我使用新的feature_id过滤器再次运行存储过程,我再次加入以仅显示已选择功能的客户。

我的问题:这很慢。

我认为可能的解决方案是:
1.在页面加载时,返回一个viewstate变量中的所有数据。所以基本上是三个嵌套对象列表。这会使我的页面加载速度变慢。 2.以一种聪明的方式执行异步隐藏。怎么样?

有更好的解决方案吗?

修改
这是一个简化的示例,因此我还需要按照通过6个表连接到表Customer的属性来过滤客户。

3 个答案:

答案 0 :(得分:0)

在ViewState中存储整个客户列表将会非常缓慢;在ViewState中存储所有客户的所有信息会更糟,除非您的整个客户群非常小,例如大约30条记录。

首先,为什么要将所有客户加载到ViewState中?如果您有大量客户,请一次加载一页数据。这至少会减少通过线路传输的数据量,并可能加快存储过程的速度。

在您的位置,我将专注于首先优化数据检索(包括最小化您返回的数量),然后担心更快的存储和显示方式。如果你遇到了阻止这种情况的非常规限制(非常慢的数据库;没有分析工具;不允许更改存储过程),请告诉我们。

答案 1 :(得分:0)

解决方案1:在查询中包含您需要筛选的任何条件,仅返回并呈现请求的记录。无需使用viewstate。

解决方案2:检索一些合理的客户页面限制,使用javascript在浏览器上过滤。允许轻松导航到下一页。

答案 2 :(得分:0)

我处理这些场景的方法是将Xml传递给SQL然后针对它运行连接。所以Xml看起来像是:

<Features><Feat Id="2" /><Feat Id="5" /><feat Id="8" /></Features>

然后你可以将那个Xml传递给SQL(取决于SQL的版本有不同的方式),但是在新版本中它比以前容易得多:

http://www.codeproject.com/Articles/20847/Passing-Arrays-in-SQL-Parameters-using-XML-Data-Ty

另外,不要在ViewState中放置任何内容;这真的没有理由。