如何对我的LINQ查询进行分组,以便获得所需的结果?

时间:2016-08-25 19:00:00

标签: vb.net linq grouping

我有一些逻辑上形成森林的桌子:

  • tblFilterSumSumID为密钥,任何此类元素都是林中的根源
  • tblFilterProdsInSum是一个表格,通过tblFilterSumtblFilterProd
  • 表示SumIDProdID之间的多对多关系
  • tblFilterProdProdID作为密钥
  • tblFilterElementsInProdtblFilterProdtblFilterElement之间通过ProdIDElementID
  • 之间的多对多关系
  • tblFilterElement表示叶节点集

逻辑上下文:

我们正在使用逻辑过滤器表达式。 tblFilterElement是一个原子逻辑表达式。许多tblFilterElement项可以通过tblFilterProdtblFilterElementsInProd相关联。 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)))))

其中每个结果代表tblFilterSumitem1将是SumID的{​​{1}},tblFilterSum将是item2,其中每个元素代表List中的TblFilterProdTblFilterSum代表TblFilterProditem1代表ProdIDitem2代表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))

这很棒并且收集了我需要的数据,但我只是不知道如何对它进行分组以收集我需要的结果。我该怎么做?

1 个答案:

答案 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以包含SumIDProdIDfilerElement的对象。然后创建了一个Dictionary,当我迭代元素时,检查SumID的键是否存在。如果没有,我创建了它。然后检查元素内是否存在ProdID键的元素,其中存在SumID的键。如果没有,我创建了它。然后我将filterElement添加到List