2010-11-29 9 views
5

मेरे पास निम्न परिणाम सेट है जो एक लिंक क्वेरी के परिणामस्वरूप उत्पन्न हुआ था। मैं इसे एक पदानुक्रमित परिणाम सेट में परिवर्तित करना चाहता हूं। पहले दो कॉलम 'मास्टर' पंक्ति का प्रतिनिधित्व करेंगे, कॉलम 3 और 4 मास्टर पंक्ति की बाल सूची का प्रतिनिधित्व करेंगे, और कॉलम 5 और 6 मास्टर पंक्ति की दूसरी बाल सूची का प्रतिनिधित्व करेंगे। मूल्य 1 9 71 वाले कॉलम शामिल कॉलम हैं।लिंक - फ्लैट से पदानुक्रम में कैसे परिवर्तित करें?

अंतिम परिणाम कंटेनरों की सूची (जी 2 कॉलम) और प्रिंटर की एक सूची (जी 3 कॉलम) के साथ एक मास्टर ऑब्जेक्ट होना चाहिए।

क्वेरी को पदानुक्रमित रूप में परिवर्तित करने के लिए कैसा दिखता है?

G1_ID G1_CellName G2_ContainerID G2_ID G2_SerialNumber G3_ID  G3_PrinterName 
1971 Default Cell 1935   1971 1101929   1971  PBG-PrtEmulator1 
1971 Default Cell 1936   1971 1101930   1971  PBG-PrtEmulator1 
1971 Default Cell 2189   1971 1102183   1971  PBG-PrtEmulator1 
+0

बस स्पष्ट करने के लिए ... आप एक पदानुक्रम चाहते हैं जो ऑब्जेक्ट की तरह कुछ दिखता है - सेल> सेल के साथ। कंटेनर, सेल। सीरियल नब्स, सेल। प्रिंटर नाम (संग्रह के रूप में)? – Tom

+0

क्या यह लिंक एसक्यूएल, लिंक से ईएफ, लिंक्स ऑब्जेक्ट्स या कुछ और है? –

+0

@ टॉम - मुझे एक पदानुक्रम चाहिए जो सेल -> सेल। कंटेनर और सेल -> प्रिंटरनाम जैसा दिखता है। सीरियल नंबर कॉलम कंटेनर की एक संपत्ति है। –

उत्तर

2

समूहबी?

var result = from eachData in data 
group eachData by new{ eachData .G1_ID, eachData .G1_CellName } 
into g1 
from eachG1 in g1 
group eachG1 by new { eachG1.G2_..., eachG1.G2_... } 
into g2 
for eachG2 in g2 
group eachG2 by new { eachG2.G3_... } 
into g3 
select g3; 

इसका परीक्षण नहीं किया है। लेकिन मुझे यकीन है कि यह इस तरह दिखने वाला होगा।

+0

मैंने ग्रुपबी को माना था, लेकिन यह प्रत्येक जी 1 तत्व में समूहित जी 2 और जी 3 डेटा के संग्रह का उत्पादन नहीं करेगा। मुझे लगता है कि आपको मूल सूची में 3 पास बनाना है, लेकिन शायद मैं गलत हूं :) – Tom

1

ठीक है, यह काफी एक सवाल उत्तेजक माध्यम से है। मैंने अतीत में बहुत सारे डेटा फ़्लैटनिंग किए हैं, और आम तौर पर मैं सभी अद्वितीय मूल्यों को रखने के लिए एक शब्दकोश का उपयोग करता हूं, फिर बाद में उनसे शादी करता हूं।

आप LINQ के लिए कहा, अब मैं एक भी पास तरीका यह है के बारे में सोच नहीं कर सकते, तो मैं VB में बजाय इस मिल गया है, ...

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) 

सूचना है कि काफी का एक बहुत काम अलग() और ToLookup() एक्सटेंशन के माध्यम से चला गया है। उम्मीद है कि यह मदद करता है, मैं देखना चाहता हूं कि कोई और "LINQy" तरीका है: डी

संबंधित मुद्दे