コレクションの一部のみを選択し、参照渡しに問題があります。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()、)(LINQのToListメソッドについてIDKのん...私はそれがない、ToEntityCollection()でのByRefにByValを変更した場合
<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
今、私は私の問題が解決されるだろうと想像していませんか?
私は実際にその関数にコレクションbyrefの一部だけを渡しますか?
おかげで、コメント後
EDIT:
@Tim Schmelter、データベース上で複数の選択を有する、夜間の同期動作のためのものであるが、その後、完全なデータセットを格納する集中多くの時間です。
@CraigあなたがIEnumerableとして残しておけば、それは実際には機能しますか?結局のところ、私は何とかしたくないので、あまりにも多くの問題を解くことができないように、複数のバッチでToArray()を呼び出します。
@NetMageコードの重要な部分を入れるのを忘れてしまった、ここにある:
:(P BTW VBやC#、私は両方を行うことができます重要ではありません)しかし:
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
私はまた、リストの事が...説明することを考えてあなたは私を得ました適切に考えている:
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
と悪の部分(少なくとも私はそれだと思う):私は、LINQのかToEntityCollectionを使用しない場合は、私のテストでByRefのものが完璧に動作しますので、今
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
、私はまだ、これが働くだろうと思うだろう良い。バッチ処理をしているだけですが、ローカル変数に格納しなければならないかもしれないと推測していましたか?
ありがとうございました!
アントン
なぜデータベースから10000000個のレコードを選択するのですか?どこに表示したいのですか?誰がすべてを見ますか? 'Where'を使ってレコード数を減らしたり、データベースのページ番号を付けたりしてください。 –
'IEnumerable(Of Entity)'のままにするのではなく、なぜそれをコレクションに変換していますか?コレクションの一部を渡したい場合は、必要なサブセットの種類に応じて、それを行ういくつかの方法があります。 'ByVal'と' ByRef'は、あなたがオブジェクト型を扱う時にはちょっとした赤ちゃんです。いずれの場合も.NET内では、オブジェクトへの参照のみが渡されます。違いは、 'ByRef'は、呼び出されたルーチンが親ルーチンの参照ポイントを別のオブジェクトにすることを可能にすることです。 – Craig
あなたのサンプルコードは、 'ToEntityCollection'が新しい' Entity'を作成することを示していません。何が起きているのかを知るために多くのコードを書いています。代わりに 'List'を使ってみませんか? –
NetMage