私は論理的に森を形成するいくつかのテーブルを持っている:LINQクエリをグループ化して、目的の結果を得るにはどうすればよいですか?
tblFilterSum
は、そのキーとしてSumID
を持っており、そのような要素が森の中に根であるtblFilterProdsInSum
は、多対多の関係を示す表でありますtblFilterSum
とtblFilterProd
SumID
経由とProdID
間tblFilterProd
tblFilterElementsInProd
そのキーが多くあるようProdID
を持っています私たちは、論理的なフィルタ式を使用して作業している:
tblFilterProd
とtblFilterElement
ProdID
経由してElementID
tblFilterElement
間-to-多くの関係は、リーフノードのセット
論理コンテキストを表します。 tblFilterElement
は、アトミック論理式です。 tblFilterElement
アイテムの多くは、tblFilterProd
にtblFilterElementsInProd
でリンクできます。 tblFilterProd
は、の項目が評価され、AND
で区切られた複合論理式を表します。 tblFilterSum
は、tblFilterProd
要素が評価され、OR
で区切られた複合論理式を表します。 IはList(Of Integer)
及びIは、それぞれ結果がtblFilterSum
表す
Dim result As List(Of Tuple(Of Integer, List(Of Tuple(Integer, List(Of TblFilterElement)))))
の結果がしたいですsumIDs
のセットに基づいてtblFilterSum
アイテムのセットを収集したいと思い、item1
はSumID
なりtblFilterSum
、item2
は全てTblFilterElement
アイテムを含むList
なり、各要素は、TblFilterSum
でTblFilterProd
を表しList
よく、各TblFilterProd
の、item1
はProdID
とitem2
となりうプロダクトの中で。
これは私の現在のコードです:素晴らしいですし、私は必要なデータを収集
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))
が、私はちょうどそれは私が必要とする結果を収集する方法にグループを知りません。私はどうしたらいいですか?
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
説明:
Linq-to-SQL/to Entitiesですか?その場合は、ナビゲーションプロパティを使用し、結合は使用しないでください。 –
@GertArnold、私に例を挙げてもらえますか?たとえば、ナビゲーションプロパティを使用してTblFilterSum要素のTblFilterProd要素セットにどのように到達する必要がありますか? –
@ GertArnold、つまり、tblFilterProdsInSumからの外部キーがなく、値と現在のテーブルスキーマの変更はオプションではありません。 –