2016-08-25 8 views
0

私は論理的に森を形成するいくつかのテーブルを持っている:LINQクエリをグループ化して、目的の結果を得るにはどうすればよいですか?

  • tblFilterSumは、そのキーとしてSumIDを持っており、そのような要素が森の中に根である
  • tblFilterProdsInSumは、多対多の関係を示す表でありますtblFilterSumtblFilterProdSumID経由とProdID
  • tblFilterProd
  • tblFilterElementsInProdそのキーが多くあるようProdIDを持っています私たちは、論理的なフィルタ式を使用して作業している

    tblFilterProdtblFilterElementProdID経由してElementID

  • tblFilterElement間-to-多くの関係は、リーフノードのセット

論理コンテキストを表します。 tblFilterElementは、アトミック論理式です。 tblFilterElementアイテムの多くは、tblFilterProdtblFilterElementsInProdでリンクできます。 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アイテムのセットを収集したいと思い、item1SumIDなりtblFilterSumitem2は全てTblFilterElementアイテムを含むListなり、各要素は、TblFilterSumTblFilterProdを表しListよく、各TblFilterProdの、item1ProdIDitem2となりうプロダクトの中で。

これは私の現在のコードです:素晴らしいですし、私は必要なデータを収集

 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 

説明:

+0

Linq-to-SQL/to Entitiesですか?その場合は、ナビゲーションプロパティを使用し、結合は使用しないでください。 –

+0

@GertArnold、私に例を挙げてもらえますか?たとえば、ナビゲーションプロパティを使用してTblFilterSum要素のTblFilterProd要素セットにどのように到達する必要がありますか? –

+0

@ GertArnold、つまり、tblFilterProdsInSumからの外部キーがなく、値と現在のテーブルスキーマの変更はオプションではありません。 –

答えて

1

これは、LINQのグループBYSに関する知識の欠如で解決した

私はSumIDProdIDfilerElementを含むオブジェクトを持っているSelectを追加しました。その後、辞書を作成し、要素を繰り返したときにSumIDのキーが存在するかどうかを確認しました。そうでなければ、私はそれを作成しました。次に、ProdIDキーを持つ要素がキー内にあるかどうかを確認します。キーはSumIDです。そうでなければ、私はそれを作成しました。次にListfilterElementを追加しました。

関連する問題