Загрузите большое дерево Silverlight (вопрос для мастеров Silverlight!) - PullRequest
0 голосов
/ 24 июля 2011

У меня есть таблица с 6400 строками. Это таблица parent-children, для нее есть внешний ключ self (ссылка на самоассоциацию в EF).

Для этого проекта все дерево должно быть загружено (загрузка данных при расширении узла не является решением для меня)

Я пытался загрузить все узлы / дерево за один раз, но оно превышает максимальное количество элементов: «Сообщение InnerException было« Максимальное количество элементов, которые могут быть сериализованы или десериализованы в графе объектов, равно 65536 ». *

Затем я попытался загрузить данные рекурсивно, но соединения maximun simultanius настроены (http://msdn.microsoft.com/en-us/library/cc304129%28VS.85%29.aspx).) Это потому, что операция load является асинхронной, а рекурсия выполняется не параллельно.

Наконец, я написал этот код для загрузки данных, он работает (медленно), но я думаю, что это грязное решение:

Private Sub loadOperation_Completed(ByVal sender As Object, ByVal e As EventArgs)

        Dim localloadOperation As LoadOperation(Of dimActivitats) = DirectCast(sender, LoadOperation(Of dimActivitats))

        If Not localloadOperation.HasError Then
            Dim llista = localloadOperation.Entities.ToList
            If llista.Any AndAlso llista.First.idSubrogatPare Is Nothing Then
                activitatsTree = llista
                TreeViewTaula.DataContext = activitatsTree
            End If

            For Each i In llista
                elementsWaitingForExpand.Push(i)
            Next
        End If

        Dim take10 = 10
        Dim IdsParentListOfElementsToProcessNow As New List(Of Integer)
        While elementsWaitingForExpand.Count > 0 And take10 > 0
            take10 -= 1
            IdsParentListOfElementsToProcessNow.Add(elementsWaitingForExpand.Pop.idSubrogat)
        End While
        Dim q2 = CActx.GetDimActivitatsListChildQuery(IdsParentListOfElementsToProcessNow)
        loadOperation = CActx.Load(Of dimActivitats)(q2)
        AddHandler loadOperation.Completed, AddressOf loadOperation_Completed

        ProgressBarTaula.Value = CActx.dimActivitats.Count

    End Sub

Я ищу что-то более элегантное (semaphor? Monitor? Queue?).


Здесь вы можете увидеть предыдущее решение, которое вызывает ошибку из-за одновременных соединений:

Private Sub loadOperation_Completed(ByVal sender As Object, ByVal e As EventArgs)
    Try
        Dim localloadOperation As LoadOperation(Of dimActivitats) = DirectCast(sender, LoadOperation(Of dimActivitats))

        If Not localloadOperation.HasError Then
            Dim llista = localloadOperation.Entities.ToList
            If llista.Any AndAlso llista.First.idSubrogatPare Is Nothing Then
                activitatsTree = llista
                TreeViewTaula.DataContext = activitatsTree

            End If

            TreeViewTaula.Dispatcher.BeginInvoke(New loadLlistaDelegate(AddressOf loadLlista), llista)
        End If
    Catch ex As Exception
    End Try
End Sub

Private Delegate Sub loadLlistaDelegate(ByVal llista As List(Of dimActivitats))
Private Sub loadLlista(ByVal llista As List(Of dimActivitats))
    For Each item In llista
        For Each fill In item.dimActivitatsChildren
            Dim q2 = CActx.GetDimActivitatsChildQuery(fill.idSubrogat)
            Dim newloadOperation = CActx.Load(Of dimActivitats)(q2)
            AddHandler newloadOperation.Completed, AddressOf loadOperation_Completed
        Next
    Next
End Sub

Есть ли у вас идеи переписать этот код более элегантным способом?

1 Ответ

0 голосов
/ 07 октября 2011

У вас есть параметр maxItemsInObjectGraph в поведении вашей службы в web.config, установленный на максимум? например,

  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <!--The service behavior for the RIA Service-->
        <behavior name="RIAServiceBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
          <dataContractSerializer **maxItemsInObjectGraph="2147483647"** />
...