我在選擇集合的一部分並通過引用傳遞時遇到問題。ByRef使用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()不,IDK的約LINQ的ToList()...現在
<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
,我無法想象我的問題將得到解決,如果我改變BYVAL到的ByRef在ToEntityCollection(),不是嗎?
那麼,我會如何實際傳遞只收集該參數的一部分?
由於註釋後
編輯:
@Tim Schmelter它爲夜間同步操作,在數據庫上具有多個選擇是更費時的存儲然後完整數據集。
@Craig你是說如果我只是把它作爲一個IEnumerable它實際上會工作嗎?畢竟我打電話ToArray()在createmultiple批反正,所以不會有太多的問題,要離開...
@ 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
我認爲這也解釋了名單的事情......(BTW 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的按地址的東西完美的作品精細。這只是當我做批處理的事情,然後它不......我猜測它可能必須做我把它存儲在本地變量?
感謝您的時間!
安東
爲什麼從數據庫中選擇10000000條記錄?你想展示給他們的地方?誰會看所有?使用'Where'來減少記錄數量或使用數據庫分頁。 –
你爲什麼要將它轉換爲一個集合,而不是將其作爲「IEnumerable(Of Entity)」?如果你想傳遞一個集合的一部分,Linq中有幾種方法可以做到這一點,這取決於你想要什麼類型的子集。當您使用對象類型時,'ByVal'與'ByRef'是一個紅鯡魚。無論哪種情況,在.NET中,只傳遞對象的引用。區別在於'ByRef'允許被調用的例程將父例程的參考點設置爲不同的對象。 – Craig
您的示例代碼未顯示「ToEntityCollection」創建了一個新的「實體」。你忽略了很多代碼來知道發生了什麼。爲什麼不用'List'代替? –
NetMage