0

目前我的表格如下所示:

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 查询吗?

4

1 回答 1

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
});
于 2013-09-04T14:56:55.807 回答