[OK]これは非常に刺激的な質問です。私は過去に多くのデータを平坦化していましたが、一般的には辞書を使ってすべてのユニークな値を保持し、後で結婚させていました。
のかなり多くいること
Private Class FlatObj
Public Property G1_ID As Integer
Public Property G1_CellName As String
Public Property G2_ContainerID As Integer
Public Property G2_ID As Integer
Public Property G2_SerialNumber As Integer
Public Property G3_ID As Integer
Public Property G3_PrinterName As String
End Class
Private Class G1
Public Property ID As Integer
Public Property CellName As String
Public Property Containers As New List(Of G2)()
Public Property PrinterNames As New List(Of G3)()
Public Overrides Function Equals(ByVal obj As Object) As Boolean
Return ID.Equals(CType(obj, G1).ID)
End Function
Public Overrides Function GetHashCode() As Integer
Return ID.GetHashCode()
End Function
End Class
Private Class G2
Public Property fID As Integer
Public Property ContainerID As Integer
Public Property SerialNumber As Integer
Public Overrides Function Equals(ByVal obj As Object) As Boolean
Return ContainerID.Equals(CType(obj, G2).ContainerID)
End Function
Public Overrides Function GetHashCode() As Integer
Return ContainerID.GetHashCode()
End Function
End Class
Private Class G3
Public Property fID As Integer
Public Property PrinterName As String
Public Overrides Function Equals(ByVal obj As Object) As Boolean
Return PrinterName.Equals(CType(obj, G3).PrinterName)
End Function
Public Overrides Function GetHashCode() As Integer
Return PrinterName.GetHashCode()
End Function
End Class
Dim fromDb As New List(Of FlatObj) From
{
New FlatObj() With {.G1_ID = 1971, .G1_CellName = "Default Cell", .G2_ContainerID = 1935, .G2_ID = 1971, .G2_SerialNumber = 1101929, .G3_ID = 1971, .G3_PrinterName = "PBG-PrtEmulator1"},
New FlatObj() With {.G1_ID = 1971, .G1_CellName = "Default Cell", .G2_ContainerID = 1936, .G2_ID = 1971, .G2_SerialNumber = 1101930, .G3_ID = 1971, .G3_PrinterName = "PBG-PrtEmulator1"},
New FlatObj() With {.G1_ID = 1971, .G1_CellName = "Default Cell", .G2_ContainerID = 2189, .G2_ID = 1971, .G2_SerialNumber = 1102183, .G3_ID = 1971, .G3_PrinterName = "PBG-PrtEmulator1"}
}
Dim g1s = fromDb.Select(Function(x) New G1 With
{
.ID = x.G1_ID,
.CellName = x.G1_CellName
}).Distinct().ToList()
Dim g2s = fromDb.Select(Function(x) New G2 With
{
.fID = x.G2_ID,
.ContainerID = x.G2_ContainerID,
.SerialNumber = x.G2_SerialNumber
}).Distinct().ToLookup(Function(x) x.fID)
Dim g3s = fromDb.Select(Function(x) New G3 With
{
.fID = x.G3_ID,
.PrinterName = x.G3_PrinterName
}).Distinct().ToLookup(Function(x) x.fID)
g1s.ForEach(Sub(g)
g.Containers.AddRange(g2s(g.ID))
g.PrinterNames.AddRange(g3s(g.ID))
End Sub)
...お知らせをあなたは今、私はこれを行うにはシングルパス方法を考えることはできません、LINQを求めたので、私はVBで、代わりにこれを持っています仕事はDistinct()とToLookup()の拡張を行っています。これが助けてくれることを願って、もっと「LINQy」の方法があるかどうかを見たいと思います:D
出典
2010-11-29 16:46:08
Tom
明確にするために...オブジェクトのように見える階層を必要とします - Cell.Containers、Cell.SerialNumbers、Cell.PrinterNames(コレクションとして)でCell? – Tom
このLinqはSqlに、LinqはEFに、Linqはオブジェクトに、または他の何かにありますか? –
@Tom - Cell - > Cell.Containers、Cell - > PrinterNamesのような階層が必要です。シリアル番号列はコンテナのプロパティです。 –