通过从数据库创建对象来访问对象的单个属性



我正在尝试优化一小块代码,这些代码一遍又一遍地连接到我们的服务器。首先,这里是代码的补丁

Dim sale as Sale()
With sale
    If .CustomerID > 0 Then
        .CustomerName = CCCustomer.SelectByID(.CustomerID).FirstNameLastName
    Else
        .CustomerName = "Cash Sale"
    End If
End With

因此,问题是,如果你有,比如说50个客户,这需要很长时间才能遍历数据,对于每个客户ID,你只需要访问CCCustomer对象,连接到数据库,按ID找到客户,然后从对象中选择FirstNameLastName。

我的第一个想法是立即提取所有客户的列表或数组,然后根据ID进行匹配,但这似乎需要更长的

Dim sale as Sale()
With sale
 Dim allCustomers() = CCCustomer.SelectAll
 If .CustomerID > 0 Then
   .CustomerName = Array.FindIndex(allCustomers, Function(c) c.CustomerID = .CustomerID)
 Else
   .CustomerName = "Cash Sale"
 End If
End With

(这段代码返回的是customerId,而不是名称,但无论哪种方式,它都需要很长时间)

我唯一能想到的另一个选项是完全重写多个存储过程,并更新对象以仅本地保存客户名称和customerID,但我想我应该在完全分解程序的其余部分之前进行检查。

那么,当你从数据库中提取数据时,有人知道一个好的方法来为这样的东西获得一个合适的加载时间吗?

编辑:很抱歉,这对我来说是一个糟糕的解释——它不是在迭代客户,而是在创建客户对象。所以,如果你有这样的东西。。。。

|  SaleID  |  CustId  |  ...  |
|    1     |    1     |  ...  |
|    2     |    1     |  ...  |
|    3     |    2     |  ...  |
|    4     |    1     |  ...  |
|    5     |    2     |  ...  |

然后它将使用CCCustomer.SelectByID(1)3次-基本上创建客户对象3次JUST以获得firstnameastname信息。

最有效、最简单(不是最安全或可读的)的方法是自己构造一个查询,将所有id添加到一个SQL查询字符串"…(其中id=12或id=44或id=77等)"中,然后使用runsql()函数或您正在使用的系统中的任何等效函数将查询字符串传递给db。如果您可以将收集ID的逻辑放入查询本身,并只传递一个条件(如人名)来选择ID,那么速度会更快。

数据库在分析查询、遍历数据和填充表方面将非常快速。

或者,您可以使用linq(即linqtosql)来获得更好的可读性和安全性代码,具有一定的价值,但性能相当。如果这不是一个选项,您还可以考虑将该功能放入数据库服务器存储过程中,并使用参数(criteria或id列表)调用该过程。

以现在的方式迭代数据库数据是最低效的方法。我预计我提到的所有其他选择都会快一到两个数量级。

最新更新