0

这是我遇到的一个问题(简化示例):假设我有几个表: 在此处输入图像描述

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

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

像这样的东西:

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

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

我目前在做什么:
1. 我DataTable从存储过程中返回客户。我将它存储在视图状态
2 中。我从存储过程返回DataTable连接到客户的功能。我将它存储在视图状态 3 中。在选择过滤器时,我使用新的 feature_id 过滤器再次运行存储过程,我再次加入其中以仅显示已选择功能的客户。

我的问题:速度很慢。

我认为可能的解决方案是:
1. 在页面加载时,在一个视图状态变量中返回所有数据。所以基本上是三个嵌套对象列表。这将使我的页面加载缓慢。2. 以某种聪明的方式执行 async loazing。如何?

有更好的解决方案吗?

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

4

3 回答 3

0

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

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

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

于 2012-10-05T20:14:44.897 回答
0

解决方案 1:在查询中包含您需要过滤的任何条件,仅返回和呈现请求的记录。无需使用视图状态。

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

于 2012-10-05T20:19:21.940 回答
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 中;真的没有理由这样做。

于 2012-10-05T20:21:09.833 回答