2016-04-21 92 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