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到实体的专家。