我只选择部分收藏品并通过引用传递它时遇到了麻烦。
所以我有一个自定义类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的功能就完全可以了。只是当我做批处理的事情时,它并没有...我猜它可能与我将它存储在局部变量中有关吗?
非常感谢您的时间!
安东
答案 0 :(得分:0)
问题是我在我的本地批次中替换了Entity的引用,而不是在我的大集合中...我通过替换我作为批处理本身发送的集合的部分来解决它,因为ToList()和ToEntityCollection都创建一个具有相同参考值的新对象......
感谢你让我的方向正确!