2017-06-14 9 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()、)(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として残しておけば、それは実際には機能しますか?結局のところ、私は何とかしたくないので、あまりにも多くの問題を解くことができないように、複数のバッチでTo​​Array()を呼び出します。

@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 

、私はまだ、これが働くだろうと思うだろう良い。バッチ処理をしているだけですが、ローカル変数に格納しなければならないかもしれないと推測していましたか?

ありがとうございました!

アントン

+0

なぜデータベースから10000000個のレコードを選択するのですか?どこに表示したいのですか?誰がすべてを見ますか? 'Where'を使ってレコード数を減らしたり、データベースのページ番号を付けたりしてください。 –

+0

'IEnumerable(Of Entity)'のままにするのではなく、なぜそれをコレクションに変換していますか?コレクションの一部を渡したい場合は、必要なサブセットの種類に応じて、それを行ういくつかの方法があります。 'ByVal'と' ByRef'は、あなたがオブジェクト型を扱う時にはちょっとした赤ちゃんです。いずれの場合も.NET内では、オブジェクトへの参照のみが渡されます。違いは、 'ByRef'は、呼び出されたルーチンが親ルーチンの参照ポイントを別のオブジェクトにすることを可能にすることです。 – Craig

+0

あなたのサンプルコードは、 'ToEntityCollection'が新しい' Entity'を作成することを示していません。何が起きているのかを知るために多くのコードを書いています。代わりに 'List 'を使ってみませんか? – NetMage

答えて

0

は、問題は、私は私の地元のバッチで、代わりに私の大きなコレクションにエンティティの参照を交換したということでした...私は私がバッチとして送信されたコレクションの一部を置き換えることによってそれを解決ToList()とToEntityCollectionはどちらも同じ参照値を持つ新しいオブジェクトを作成するので、バッチ自体では...

正しい方向の人に私を入れてくれてありがとう!

関連する問題