好的,这就是我现在所拥有的东西,除了它有点慢之外还能很好地运作:
Public Function GetList() As List(Of SalesOrder)
Try
Dim list As New List(Of SalesOrder)
Dim ds As DataSet
ds = cls.GetSalesOrderList 'CLS is the data access class
For i = 0 To ds.Tables(0).Rows.Count - 1
Dim row As DataRow = ds.Tables(0).Rows(i)
Dim kk As SalesOrder = New SalesOrder()
kk.ID = Val(row.Item("id") & "")
kk.SalesOrderNo = row.Item("salesorderid") & ""
kk.SalesOrderDate = row.Item("OrderDate") & ""
kk.CustomerId = Val(row.Item("customerid") & "")
list.Add(kk)
Next
Return list
Catch ex As Exception
Throw ex
End Try
End Function
现在,当我开始从表中检索超过10000条记录时,循环需要很长时间才能将值加载到泛型类中。有什么方法可以摆脱循环吗?我可以使用泛型类执行以下操作吗?
txtSearch.AutoCompleteCustomSource.AddRange(Array. ConvertAll(Of DataRow, String)(BusinessLogic.ToDataTable.ConvertTo(WorkOr derList).Select(), Function(row As DataRow) row("TradeContactName")))
答案 0 :(得分:0)
我原以为问题不在于循环,而在于数据量。您的循环方法似乎只处理每一位数据,因此没有任何大规模的效率崩溃(例如,对数据集进行一次循环,然后再对每一行或类似事件进行循环)。您选择的任何方法都是在一天结束时必须遍历所有数据。
他们的方法可能比你的方法略高一些但是它们不会那么多,所以我想。我会看一下你是否可以做一些重构来减少你的数据集(例如将它限制在一定的时间段或类似时间),或者你是否可以在数据库而不是代码中搜索或聚合你想要的列表。例如,如果你只是要对该列表的值求和,那么你几乎肯定可以通过一个存储过程对数据库而不是代码进行求和来做得更好。
我知道这并没有直接回答你的问题,但这主要是因为我不知道一种更有效的方法。我把问题视为一般要求优化,而不是如何做这个特定的。 :)
答案 1 :(得分:0)
如果您仍然一次枚举每一行,那么将循环转换为某种LINQ构造并不一定会提高性能。如果你不需要让消费者能够从列表中添加/删除(看起来可能就是这种情况),你可以返回IEnumerable(Of SalesOrder),然后在这种情况下你可以创建一个枚举器来处理这个。这样,数据集就会被一次性加载,但这些项目只有在被枚举时才会被转换为对象,这可能是性能损失的一部分。
这样的事情:
Return ds.Tables(0).Rows.Select(Function(dr As DataRow) Return New SalesOrder ... );
我的带有LINQ的VB有点生疏,但有一些效果,其中......是实例化新SalesOrder的代码。这只会创建一个新的SalesOrder对象,因为IEnumerable(Of SalesOrder)被枚举(懒惰,如果你愿意)。
答案 2 :(得分:0)
嘿保罗,你的意思是下面的代码
Dim list As New List(Of SalesOrder)
Dim kk As SalesOrder = New SalesOrder()
Function DrToOrder(dr as datareader)
kk.ID = Val(dr.Item("id") & "")
kk.SalesOrderNo = dr.Item("salesorderid") & ""
list.Add(kk)
End function
Function LoadData()
datareader.Rows.Select(DrToOrder)
End function
你在谈论上面的代码吗?