Vb.net 如何在没有循环的情况下加载泛型类

Vb.net 如何在没有循环的情况下加载泛型类,vb.net,generics,data-access-layer,Vb.net,Generics,Data Access Layer,好的,这就是我现在拥有的东西,除了有点慢之外,它工作得很好: 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.Coun

好的,这就是我现在拥有的东西,除了有点慢之外,它工作得很好:

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多条记录,循环就需要很长时间才能将值加载到泛型类中。有没有什么办法可以摆脱loop?我可以对泛型类执行以下操作吗

txtSearch.AutoCompleteCustomSource.AddRange(Array. ConvertAll(Of DataRow, String)(BusinessLogic.ToDataTable.ConvertTo(WorkOr derList).Select(), Function(row As DataRow) row("TradeContactName"))) 

我本以为问题不在于循环,而在于大量的数据。您的循环方法似乎只处理每一位数据一次,因此不会出现任何大规模的效率崩溃(例如,对于每一行或类似的事情,在数据集上循环一次)。您选择的任何方法最终都必须循环使用所有数据

他们的方法可能比你的稍有效率,但我认为不会有那么多。我想看看您是否可以进行重构以减少数据集(例如将其限制在某个时间段或类似时间),或者您是否可以在数据库中而不是在代码中搜索或聚合该列表。例如,如果您只是要对该列表的值求和,那么几乎可以肯定,通过使用一个存储过程在数据库而不是代码中进行求和,您可以做得更好


我知道这并没有直接回答你的问题,但这主要是因为我不知道有什么更有效的方法。我把这个问题看作是一般性的优化问题,而不是具体的优化问题

如果仍然同时对每一行进行枚举,那么将循环转换为某种LINQ构造并不一定会提高性能。如果不需要为消费者提供从列表中添加/删除的功能(看起来可能是这样),您可以返回IEnumerable(销售订单的),然后在这种情况下,您可以创建一个枚举器来处理此问题。通过这种方式,数据集一次全部加载,但只有在枚举项时才将其转换为对象,这可能是性能影响的一部分

大概是这样的:

Return ds.Tables(0).Rows.Select(Function(dr As DataRow) Return New SalesOrder ... );

我的VB与LINQ是有点生锈,但某种效果,在哪里。。。是实例化新SalesOrder的代码。这只会在枚举(SalesOrder的)IEnumerable时创建一个新的SalesOrder对象(如果愿意的话,则为lazy)

嘿,保罗,你是说下面的代码

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 

你是在讨论上面的代码吗?

你可以用LINQ来做这个,但是因为你的代码在VB中,所以我不会试图提供答案。考虑给你的回答者添加VB.NET TAG感谢。但是我想只要代码是用.net编写的,那么代码是用vb.net还是C#编写就不重要了。因为我对C#和vb.net都很在行。所以,如果你对我的问题有任何解决办法,即使是在C#中,那就告诉我。我会非常感激的。ThanksTHROW EX-不要这样做-它会破坏EX中的调用堆栈,隐藏重要信息,但一无所获。甚至不要在没有前男友的情况下扔东西(尽管这样更好)。如果无法处理错误,请不要捕捉它。//特例警察的话;-)谢谢你的回复。但是我确信我的问题的答案隐藏在下面的代码中。只是我不能将这个逻辑转换成我的泛型类代码。下面的代码将关键字添加到文本框中,用于无循环搜索。这些值来自泛型类集合(列表)。我明白了,是这样的:txtSearch.AutoCompleteCustomSource.AddRange(数组.ConvertAll(数据行,字符串)(BusinessLogic.ToDataTable.ConvertTo(Worker derList).Select(),函数(数据行为数据行)行(“TradeContactName”))。但我从未使用过IEnumerable。我检查了以下链接,但有点复杂。我的类非常简单,没有任何添加/删除方法。顺便说一句,在C#中,返回ds.Tables[0].Rows.Select(dr=>newsalesforder(dr));这里有一个从数据行填充对象的构造函数重载。根据你的风格,你可以采用多种方式。这里的Select()语句可以隐式转换为IEnumerable(Of T),所以如果使用此方法,只需将方法的返回类型设置为IEnumerable(Of SalesOrder)——就是这样。Select()将如何转换认识到泛型类的哪个属性必须用数据集的哪个字段填充吗?你的想法看起来不错,但我正在努力将它实现到我的代码中。可能是因为我对数字很陌生。你能帮我吗。如果您能将我的getList()函数转换为IEnumerable,这将是一个很大的帮助。即使使用C代码,我也可以。然后我会对实施有一些更好的想法。有没有可能?这就是上面例子中的“…”。您可以在lambda主体中执行此操作(如果属性计数小到可读),或者您可以在SalesOrder上创建一个构造函数重载,该重载接受一个DataRow并在那里执行,或者您可以创建一个方法,将DataRow转换为SalesOrder,并将其作为委托传递给Select(即,如果您的函数被称为DrToOrder)(dr As DataRow),然后调用Rows.Select(DrToOrder)。您可能需要在VB中使用AddressOf。)