Sql server 2012 使用EF 6检索按月份分组的每日数据记录的最有效方法
我有一个具有以下结构的表:Sql server 2012 使用EF 6检索按月份分组的每日数据记录的最有效方法,sql-server-2012,linq-to-entities,grouping,entity-framework-6,dbcontext,Sql Server 2012,Linq To Entities,Grouping,Entity Framework 6,Dbcontext,我有一个具有以下结构的表: | Column Name | Type | |-------------|--------------- | | ProjectId | INT | | StartDate | INT | | Amount | DECIMAL(12, 2) | StartDate是一个INT,但它实际上表示一天,格式为YYYYMMDD 该表存储项目的每日数值(仅存储工作日,不存储星
| Column Name | Type |
|-------------|--------------- |
| ProjectId | INT |
| StartDate | INT |
| Amount | DECIMAL(12, 2) |
StartDate
是一个INT
,但它实际上表示一天,格式为YYYYMMDD
该表存储项目的每日数值(仅存储工作日,不存储星期日或星期六),如下所示:
| ProjectId | StartDate | Amount |
|-----------|-----------|--------|
| 1 | 20140926 | 0.5 |
| 1 | 20140929 | 0.5 |
| 1 | 20140930 | 0.8 |
| 1 | 20141001 | 1 |
| 1 | 20141002 | 1 |
| 1 | 20141003 | 0.5 |
| 2 | 20141001 | 0.6 |
| 2 | 20141002 | 0.5 |
获取每个项目的月平均值的最有效方法是什么?我正在使用EF6(DbContext方法)和SQLServer2012?我正在寻找一个解决方案使用Linq到实体
理想的结果是这样的:
| ProjectId | StartDate | Amount |
|-----------|-----------|--------|
| 1 | 20140926 | 0.6 |
| 1 | 20141001 | 0.83 |
| 2 | 20141001 | 0.55 |
我有一个解决方案,但我不确定它是否最优:
var results = dbContext.ProjectValues
.GroupBy(pv =>
new
{
ProjectId = pv.ProjectId,
Year = pv.StartDate.Year,
Month = pv.StartDate.Month,
})
.Select(g =>
new
{
ProjectId = g.Key.ProjectId,
StartDate = g.Min(v => v.StartDate),
Amount = g.Average(v => v.Amount)
})
.ToList();
您可以按项目id和月份进行分组 日期存储为int,使用cast转换为日期
SELECT ProjectID,
AVG(Amount) as AverageAmount,
DATEADD(MONTH, DATEDIFF(MONTH,0,CAST(CAST(StartDate AS VARCHAR(12)) AS DATE)), 0)
FROM Table1
GROUP BY ProjectID, DATEADD(MONTH, DATEDIFF(MONTH,0,CAST(CAST(StartDate AS VARCHAR(12)) AS DATE)), 0)
虽然SQL代码是正确的,但我想要一个使用linq转换实体的解决方案。@kjv,明白了。我不是linq到实体的专家。