使用Linq的ByRef局部变量

时间:2017-06-14 14:22:24

标签: vb.net 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()...

<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它实际上会起作用吗?毕竟我无论如何都要在创建多个批处理中调用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

我认为这也解释了列表的事情......(BTW vb或c#don&t't ties我可以做到两件事: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的功能就完全可以了。只是当我做批处理的事情时,它并没有...我猜它可能与我将它存储在局部变量中有关吗?

非常感谢您的时间!

安东

1 个答案:

答案 0 :(得分:0)

问题是我在我的本地批次中替换了Entity的引用,而不是在我的大集合中...我通过替换我作为批处理本身发送的集合的部分来解决它,因为ToList()和ToEntityCollection都创建一个具有相同参考值的新对象......

感谢你让我的方向正确!