这是一个场景:
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
我要寻找的是:如何选择所有没有绑定到another
的祖先的叶tree
项即: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)
好的,
我不指望有解决方案,因为这是一个有点难的问题。
我发布了我的最终代码。在生产环境中,性能就足够了。
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
欢迎所有评论,我将标记一个解决方案,任何方法都比我的好。