LINQ EF4.1 Tree Query - PullRequest
       26

LINQ EF4.1 Tree Query

1 голос
/ 02 февраля 2012

Это сценарий:

2 Объекты: tree и another

            tree

id    idParent     someValue
1     NULL         ALL
2     1            Child1.1
3     2            Child2.1
4*    2            child...
5     4            child...
6*    1            child...
7     1            child1.3
8     1            child...
9     8            child1.4.1
...

           another

id    idTree      SomeValue
1     4*          bind 1
2     6*          bind 2

Графика:

       tree
1
   2
      3
      4*      --> binded to 1
         5
   6*         --> binded to 2
   7
   8
      9

Я ищу это: Как выбрать все листовые tree элементы, у которых нет предка, привязанного к another. То есть: 3, 7, 9

            tree

id    idParent     someValue
3     2            Child2.1
7     1            child1.3
9     8            child1.4.1

То, что япопытался

Я разбил проблему на небольшие вопросы: получение всех конечных элементов, а затем рекурсивный просмотр для проверки - это привязка предка, и так далее.Но я получаю время ожидания ошибок или плохую производительность, потому что у меня есть 25k элементов дерева, и я не знаю, как получить запрос без временных структур, таких как lists.

Мне нужен новый подход к этой проблеме.Все комментарии приветствуются.

Мой код (работает ... медленно, потому что рекурсия):

 Private Sub busca_no_assignats(
      ByRef l As List(Of Integer), 
      ByRef items As Object, 
      ByVal limit As Integer)
            If l.Count > limit Then
                Exit Sub
            End If
            For Each cu In items
                If cu.childrenItems.Count > 0 Then
                    If cu.others.Count = 0 Then
                        busca_no_assignats(l, cu.childrenItems, limit)
                    End If
                Else
                    If cu.others.Count = 0 Then
                        l.Add(cu.idItem)
                    End If
                End If
            Next
        End Sub


 Private Sub items_pendents_assignar_a_activitat_PreprocessQuery(
     ByRef query As System.Linq.IQueryable(Of LightSwitchApplication.tree))

     Dim l As New List(Of Integer)
     busca_no_assignats(l, Me.DataWorkspace.CAnaliticaData.tree_root_items, 100)

     query = From u In query
                    Where l.Contains(u.IdUnitat)

        End Sub
 End Class

(да, это EF через световой переключатель)

1 Ответ

1 голос
/ 02 февраля 2012

Хорошо,

Я не ожидаю решения, потому что это немного сложный вопрос.

Я публикую свой окончательный код.Производительности достаточно в производственной среде.

Private Sub busca_no_assignats(
            ByRef l As List(Of Integer), 
            ByRef unitats As Object, 
            ByVal limit As Integer)
    If l.Count > limit Then
        Exit Sub
    End If
    For Each cu In unitats
        If l.Count < limit AndAlso cu.others.Count = 0 Then
            If cu.childrenItems.Count = 0 Then
                If cu.others.Count = 0 Then
                    l.Add(cu.idItem)
                End If
            Else
                busca_no_assignats(l, cu.childrenItems, limit)
            End If
        End If
    Next
End Sub

Все комментарии приветствуются, и я отмечу решение любым подходом лучше, чем мой.

...