簡體   English   中英

使用Linq的ByRef局部變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM