2012-02-02 6 views
1

Это сценарий:LINQ EF4.1 Дерево запросов

2 Entities: 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 

Graphicaly:

 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 

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

Я разделил проблему мелких вопросов: получение всех элементов листа, то рекурсивные для тестирования является предок переплетены, так на. Но я получаю ошибки во времени или плохую производительность, потому что у меня есть 25 тыс. Элементов дерева, и я не знаю, как получить запрос с временными структурами, такими как 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 через LightSwitch)

ответ

1

Ok,

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

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

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 

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

Смежные вопросы