LINQ - 静态列转换为聚合行值

时间:2013-09-04 11:16:50

标签: c# .net sql linq entity-framework

目前我的表格如下所示:

Id    StockCompanyId    StockIndexId    FilterDatePeriodId    Q0     Q1     Q2     Q3     Q4     Q5     Q6     Q7     Q8     Q9     Q10     Q11     Q12     Q13     Q14     Q15     Q16     Q17     Q18     Q19     Q20
6301  4                 1               NULL                  NULL   NULL   NULL   0.14   0.14   0.14   0.14   NULL   NULL   NULL   NULL    0.05    0.05    0.05    0.05    NULL    NULL    NULL    NULL    NULL    NULL
6553  1                 1               NULL                  NULL   NULL   NULL   0.53   0.53   0.53   0.53   0.58   0.58   0.58   0.58    0.55    0.55    0.55    0.55    0.50    0.50    0.50    0.50    0.43    0.43
6805  2                 1               NULL                  NULL   NULL   NULL   0.00   0.00   0.00   0.00   0.05   0.05   0.05   0.05    0.08    0.08    0.08    0.08    0.06    0.06    0.06    0.06    0.07    0.07
7057  3                 1               NULL                  NULL   NULL   NULL   0.11   0.11   0.11   0.11   0.13   0.13   0.13   0.13    0.17    0.17    0.17    0.17    0.17    0.17    0.17    0.17    0.17    0.17
7309  5                 1               NULL                  NULL   NULL   NULL   0.16   0.16   0.16   0.16  -0.16  -0.16  -0.16  -0.16    0.19    0.19    0.19    0.19   -0.34   -0.34   -0.34   -0.34    0.00    0.00

列是静态设计,我们总是保留20Q的财务数据,当新的季度到来时,我们将所有数据从左向右移动并将新值放入Q0

我目前需要的是具有聚合功能的上述转置版本。

  

对于选定的公司集团(StockCompanyId的集合),并提供股票指数(StockIndexId)计算每个季度的平均值,并从最新的季度到最新的季度

所以最终的结果应该是这样的:

Quarter    Aggregated Value
0          0.53    <-- Average(values for all matched companies and provided stock index)
1          0.71
2          0.81
3          ...
4          ...
5          ...
6          ...
7          ...
8          ...
9          ...
10         ...
11         ...
12         ...
13         ...
14         ...
15         ...
16         ...
17         ...
18         ...
19         ...
20         ...

并将此数据作为DTO模型列表发送:

public class DTO
{
    public string Quarter {get; set;}
    public decimal AggregatedValue {get; set;}
}

List<DTO> ResponseValues

任何人都可以帮我构建符合此要求的LINQ查询吗?

1 个答案:

答案 0 :(得分:0)

这是一个kludge,但这应该有效:

var matches = (
  from entry in table
  where entry.StockIndexId == StockIndexId
  where Companies.Contains(entry.StockCompanyId)
  select entry).ToList();

var ResponseValues = new List<DTO>();

ResponseValues.Add(new DTO {
  Quarter = 0,
  AggregatedValue = matches.Sum(
    match => match.Q0 ?? 0
  ) / matches.Length
});
ResponseValues.Add(new DTO {
  Quarter = 1,
  AggregatedValue = matches.Sum(
    match => match.Q1 ?? 0
  ) / matches.Length
});
... snip ...
ResponseValues.Add(new DTO {
  Quarter = 20,
  AggregatedValue = matches.Sum(
    match => match.Q20 ?? 0
  ) / matches.Length
});