2016-04-21 63 views
0

這是情況:我有大量的數據存儲在'mysamples'作爲下面的數據結構。我需要做一些關於數據的查詢和報告工作,而我是Linq的新手。首先,我需要編寫一個Linq腳本來提取所有記錄的每月年度報告。它將總結'mysamples'中所有樣本的所有樣本點(當年,按月分類)的'值'。我可以很容易地在vb.net代碼中做到這一點,但是我意識到Linq是適合這種應用的正確工具。任何人都可以給我一些開始。謝謝。一個簡單的LINQ查詢

Public Structure sample 
    Public Property id As String 
    Public datapoints As List(Of sampledatapoint) 
End Structure 

Public Structure sampledatapoint 
    Public time As DateTime 
    Public value As Decimal 
End Structure 

Public mysamples As New List(Of sample) 
+1

給出一些輸入數據和預期結果 –

回答

1
Dim sampleQ1 as New sample() With {.id ="2016Q1", .datapoints = New List(Of sampledatapoint)()} 
    sampleQ1.datapoints.Add(New sampledatapoint() With {.time = New DateTime(2016, 1, 1), .value = 1000}) 
    sampleQ1.datapoints.Add(New sampledatapoint() With {.time = New DateTime(2016, 1, 10), .value = 2000}) 
    sampleQ1.datapoints.Add(New sampledatapoint() With {.time = New DateTime(2016, 2, 1), .value = 500}) 
    sampleQ1.datapoints.Add(New sampledatapoint() With {.time = New DateTime(2016, 3, 7), .value = 750}) 

    Dim sampleQ2 as New sample() With {.id ="2016Q2", .datapoints = New List(Of sampledatapoint)()} 
    sampleQ2.datapoints.Add(New sampledatapoint() With {.time = New DateTime(2016, 4, 4), .value = 800}) 
    sampleQ2.datapoints.Add(New sampledatapoint() With {.time = New DateTime(2016, 4, 5), .value = 150}) 

    Dim sampleQ4 as New sample() With {.id ="2015Q4", .datapoints = New List(Of sampledatapoint)()} 
    sampleQ4.datapoints.Add(New sampledatapoint() With {.time = New DateTime(2015, 10, 20), .value = 666}) 

    Dim mysamples As New List(Of sample) 
    mysamples.Add((sampleQ1)) 
    mysamples.Add((sampleQ2)) 
    mysamples.Add((sampleQ4)) 

    Dim q = From sdp In mysamples.SelectMany(Function(x) x.datapoints).Where(Function(x) x.time.Year = DateTime.Now.Year) 
      Group By grp = sdp.time.Month Into Group 
      Select New With {.Month = grp, .Sum = Group.Sum(Function(x) x.value)} 

    For Each monthlySum In q 
     Console.WriteLine("Month: {0}, Sum: {1}", monthlySum.Month, monthlySum.Sum) 
    Next 

    'Month: 1, Sum: 3000 
    'Month: 2, Sum: 500 
    'Month: 3, Sum: 750 
    'Month: 4, Sum: 950 

SelectMany的伎倆。它將所有樣本的所有抽樣點平展成一個列表。 Group By保持不變。

此外:是否有任何理由爲什麼您使用struct而不是class?我建議至少爲sample使用一個類,因爲它既不代表單個值也不包含值類型。

+0

感謝Alex。你還可以幫助我進一步......看到我原來的帖子,samledatapoint的列表是類「s​​ample」的變量之一。我可能需要進一步過濾關於sample.id以及。你能告訴我如何在查詢中包裝樣本數據結構嗎? – uqji

+0

你是否想要所有采樣點的所有采樣點都不考慮它們的ID?或者你想要它按ID分組?或過濾到一個特定的ID? –

+0

所有數據都存儲在一個大列表「mysamples」中作爲樣本列表。是的,所有樣本中的所有抽樣點都是自己的ID。 – uqji