我有一些逻辑上形成森林的桌子:
tblFilterSum
以SumID
为密钥,任何此类元素都是林中的根源tblFilterProdsInSum
是一个表格,通过tblFilterSum
和tblFilterProd
SumID
和ProdID
之间的多对多关系
tblFilterProd
以ProdID
作为密钥tblFilterElementsInProd
是tblFilterProd
和tblFilterElement
之间通过ProdID
和ElementID
tblFilterElement
表示叶节点集逻辑上下文:
我们正在使用逻辑过滤器表达式。 tblFilterElement
是一个原子逻辑表达式。许多tblFilterElement
项可以通过tblFilterProd
与tblFilterElementsInProd
相关联。 tblFilterProd
表示复合逻辑表达式,其中tblFilterElement
项目使用AND
进行评估和分隔。 tblFilterSum
表示复合逻辑表达式,其中tblFilterProd
元素由OR
进行评估和分隔。我想基于一组tblFilterSum
收集一组sumIDs
项,这是一个List(Of Integer)
,我希望得到
Dim result As List(Of Tuple(Of Integer, List(Of Tuple(Integer, List(Of TblFilterElement)))))
其中每个结果代表tblFilterSum
,item1
将是SumID
的{{1}},tblFilterSum
将是item2
,其中每个元素代表List
中的TblFilterProd
,TblFilterSum
代表TblFilterProd
,item1
代表ProdID
,item2
代表List
包含产品中的所有TblFilterElement
项。
这是我目前的代码:
Dim elements = (From filterSum In BOs.GeneralBO.GetDataContext.GetTable(Of TblFilterSum)
Join filterProdInSum In BOs.GeneralBO.GetDataContext.GetTable(Of TblFilterProdsInSum)
On filterSum.SumID Equals filterProdInSum.SumID
Join filterProd In BOs.GeneralBO.GetDataContext.GetTable(Of TblFilterProd)
On filterProdInSum.ProdID Equals filterProd.ProdID
Join filterElementInProd In BOs.GeneralBO.GetDataContext.GetTable(Of TblFilterElementsInProd)
On filterProd.ProdID Equals filterElementInProd.ProdID
Join filterElement In BOs.GeneralBO.GetDataContext.GetTable(Of TblFilterElement)
On filterElementInProd.ElementID Equals filterElement.ElementID
Where sumIDs.Contains(filterSum.SumID))
这很棒并且收集了我需要的数据,但我只是不知道如何对它进行分组以收集我需要的结果。我该怎么做?
答案 0 :(得分:1)
这是缺乏LINQ group bys知识的解决方案:
Dim elements = (From filterSum In dataContext.GetTable(Of TblFilterSum)
Join filterProdInSum In dataContext.GetTable(Of TblFilterProdsInSum)
On filterSum.SumID Equals filterProdInSum.SumID
Join filterProd In dataContext.GetTable(Of TblFilterProd)
On filterProdInSum.ProdID Equals filterProd.ProdID
Join filterElementInProd In dataContext.GetTable(Of TblFilterElementsInProd)
On filterProd.ProdID Equals filterElementInProd.ProdID
Join filterElement In dataContext.GetTable(Of TblFilterElement)
On filterElementInProd.ElementID Equals filterElement.ElementID
Where sumIDs.Contains(filterSum.SumID)).Select(Function(r) New With {.SumID = r.filterSum.SumID, .ProdID = r.filterProd.ProdID, .filterElement = r.filterElement}).ToList
'Dim results As New List(Of TTPair(Of Integer, List(Of TTPair(Of Integer, List(Of TblFilterElement)))))
Dim results As New Dictionary(Of Integer, Dictionary(Of Integer, List(Of TblFilterElement)))
For Each element In elements
If (Not results.ContainsKey(element.SumID)) Then
results.Item(element.SumID) = New Dictionary(Of Integer, List(Of TblFilterElement))
End If
If (Not results.Item(element.SumID).ContainsKey(element.ProdID)) Then
results.Item(element.SumID).Item(element.ProdID) = New List(Of TblFilterElement)
End If
results.Item(element.SumID).Item(element.ProdID).Add(element.filterElement)
Next
说明:
我添加了Select
以包含SumID
,ProdID
和filerElement
的对象。然后创建了一个Dictionary,当我迭代元素时,检查SumID
的键是否存在。如果没有,我创建了它。然后检查元素内是否存在ProdID
键的元素,其中存在SumID
的键。如果没有,我创建了它。然后我将filterElement
添加到List
。