目前我的表格如下所示:
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查询吗?
答案 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
});