[英]ByRef Local Variable using Linq
我在僅選擇集合的一部分並通過引用傳遞時遇到了麻煩。
因此,我有一個自定義類EntityCollection,它是猜測的實體集合。 我必須通過HTTPSOAP將這些實體發送到Web服務。
不幸的是,我的收藏確實很大,比如說有10000000個實體,這使我拋出HTTP錯誤,告訴我我的請求包含太多數據。
我發送給它的方法采用了集合的引用,因此它可以進一步完成在創建實體時自動生成的丟失信息。
我最初的解決方案:
For i As Integer = 0 To ecCreate.Count - 1 Step batchsize
Dim batch As EntityCollection = ecCreate.ToList().GetRange(i, Math.Min(batchsize, ecCreate.Count - i)).ToEntityCollection()
Q.Log.Write(SysEnums.LogLevelEnum.LogInformation, "SYNC KLA", "Creating " & String.Join(", ", batch.Select(Of String)(Function(e) e("nr_inca")).ToArray()))
Client.CreateMultiple(batch)
Next
ecCreate是一個EntityCollection。
我忘記的是,使用ToList()和ToEntityCollection()(我寫過)創建了一個新實例...
至少ToEntityCollection()這樣做,關於LINQ的ToList()的idk ...
<Extension()>
Public Function ToEntityCollection(ByVal source As IEnumerable(Of Entity)) As EntityCollection
Dim ec As New EntityCollection()
'ec.EntityTypeName = source.FirstOrDefault.EntityTypeName
For Each Entity In source
ec.Add(Entity)
Next
Return ec
End Function
現在,我不認為如果在ToEntityCollection()中將ByVal更改為ByRef,是否可以解決我的問題,對嗎?
那么,我實際上如何只將集合byref的一部分傳遞給該函數呢?
謝謝
評論后編輯:
@Tim Schmelter,它是一個每晚同步操作,在數據庫上進行多次選擇比存儲完整的數據集更加耗時。
@Craig您是否在說,如果我只是將其保留為IEnumerable,它將實際上起作用嗎? 畢竟我還是要在createmultiple批處理中調用ToArray(),這樣就不會有太多問題了...
@NetMage你是對的,我忘了輸入代碼的關鍵部分,在這里:
Public Class EntityCollection
Implements IList(Of Entity)
'...
Public Sub Add(item As Entity) Implements ICollection(Of Entity).Add
If IsNothing(EntityTypeName) Then
EntityTypeName = item.EntityTypeName
End If
If EntityTypeName IsNot Nothing AndAlso item.EntityTypeName IsNot Nothing AndAlso item.EntityTypeName <> EntityTypeName Then
Throw New Exception("EntityCollection can only be of one type!")
End If
Me.intList.Add(item)
End Sub
我認為這也解釋了列表的問題...(順便說一句vb或c#沒關系,我可以同時做兩個:p)
但是:您讓我正確地思考:
Public Sub CreateMultiple(ByRef EntityCollection As EntityCollection)
'... do stuff to EC
Try
Dim ar = EntityCollection.ToArray()
Binding.CreateMultiple(ar) 'is also byref(webservice code)
EntityCollection.Collection = ar 'reset property, see below
Catch ex As SoapException
Raise(GetCurrentMethod(), ex)
End Try
End Sub
和邪惡的部分(至少我認為是):
Friend Property Collection As Object
Get
Return Me.intList
End Get
Set(value As Object)
Me.Clear()
For Each e As Object In value
Me.Add(New Entity(e))
Next
End Set
End Property
現在,我仍然認為這會起作用,因為在我的測試中,如果我不使用Linq或ToEntityCollection,byref的東西也可以很好地工作。 只是當我做批處理時,然后就沒有了……我猜想這可能與我將其存儲在局部變量中有關嗎?
感謝您的寶貴時間!
安東
問題是我在本地批處理中而不是在我的大集合中替換Entity的引用...我解決了這一問題,因為我將批處理發送的集合部分替換為該批處理本身,因為ToList()和ToEntityCollection都創建一個具有相同參考值的新對象...
謝謝您讓我朝正確的方向前進!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.