一个简单的linq查询

时间:2016-04-21 06:34:28

标签: vb.net linq

情况如下:我将大量数据存储在'mysamples'中作为以下数据结构。我需要对数据进行一些查询和报告工作,我是Linq的新手。首先,我需要编写一个Linq脚本来提取所有记录的月度年度报告。它总结了'mysamples'中所有样本的所有样本点(当前年份,按月分类)的“价值”。我可以在vb.net代码中轻松完成,但我意识到Linq是适合这种东西的正确工具。任何人都可以给我一些东西。谢谢。

<h1>Heading 1 value</h1>

1 个答案:

答案 0 :(得分: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,因为它既不代表单个值,也不包含值类型。

相关问题