2017-06-14 62 views
0

我在選擇集合的一部分並通過引用傳遞時遇到問題。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的按地址的東西完美的作品精細。這只是當我做批處理的事情,然後它不......我猜測它可能必須做我把它存儲在本地變量?

感謝您的時間!

安東

+0

爲什麼從數據庫中選擇10000000條記錄?你想展示給他們的地方?誰會看所有?使用'Where'來減少記錄數量或使用數據庫分頁。 –

+0

你爲什麼要將它轉換爲一個集合,而不是將其作爲「IEnumerable(Of Entity)」?如果你想傳遞一個集合的一部分,Linq中有幾種方法可以做到這一點,這取決於你想要什麼類型的子集。當您使用對象類型時,'ByVal'與'ByRef'是一個紅鯡魚。無論哪種情況,在.NET中,只傳遞對象的引用。區別在於'ByRef'允許被調用的例程將父例程的參考點設置爲不同的對象。 – Craig

+0

您的示例代碼未顯示「ToEntityCollection」創建了一個新的「實體」。你忽略了很多代碼來知道發生了什麼。爲什麼不用'List '代替? – NetMage

回答

0

的問題是,我是代替實體的引用在我的本地批次,而不是我的大集合......我解決它通過更換我發來的一批收藏的一部分與批處理本身,因爲ToList()和ToEntityCollection都創建一個新的對象具有相同的參考值...

感謝您把我放在正確的方向傢伙!