У меня есть таблица с 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
Есть ли у вас идеи переписать этот код более элегантным способом?