2012-02-02 79 views
1

這是情景:LINQ EF4.1樹查詢

2實體:treeanother

  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 

那我試圖

我分裂的小問題的問題:讓所有葉項再看看遞歸測試是祖先綁定,一個如此上。但是,由於我有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

好吧,

我不期待,因爲它的解決方案是一個有點難的問題。

我發佈我的最終代碼。生產環境中的性能足夠了。

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 

歡迎所有的評論,我會標記一個解決方案比我更好的方法。