Linq - 按日期分组并选择计数

9 浏览
0 Comments

Linq - 按日期分组并选择计数

我目前正在解决一个问题,我希望运行一个查询,按选择的日期对结果进行分组。

以此例为例,假设有一个简单的模型如下:

public class User
{
      public DateTime LastLogIn {get; set;}
      public string Name {get; set;}
}

我要解决的问题是获取按日期登录的用户数量。

在数据库中,DateTime存储了日期和时间组件,但对于这个查询,我只关心日期。

我目前的代码如下:

context.Users
       .Where((x.LastLogIn >= lastWeek)    
           && (x.LastLogIn <= DateTime.Now))
       .GroupBy(x => EntityFunctions.TruncateTime(x.LastLogIn))
       .Select(x => new
       {
           Value = x.Count(),
           Day = (DateTime)EntityFunctions.TruncateTime(x.Key)
       }).ToList();

然而,上述代码返回一个空列表。

最终目标是获得一个包含对象的列表,该对象包含一个Value(某一天登录的用户数量)和一个Day(所讨论的日期)。

有什么想法吗?

在更改查询为以下代码后:

context.Users
       .Where((x.LastLogIn >= lastWeek)    
           && (x.LastLogIn <= DateTime.Now))
       .GroupBy(x => EntityFunctions.TruncateTime(x.LastLogIn))
       .Select(x => new
       {
           Value = x.Count(),
           Day = (DateTime)x.Key
       }).ToList();

现在返回一个列表,其中只有一个项目,Value是与where子句匹配的用户总数,Day是第一天。它似乎仍然无法按天分组。

注意:原来的代码是正确的,我只是做错了其他事情。

生成的SQL是(注意,我在调整它以适应示例时可能会有非常细微的语法错误):

SELECT 
1 AS [C1], 
[GroupBy1].[A1] AS [C2], 
CAST( [GroupBy1].[K1] AS datetime2) AS [C3]
FROM ( SELECT 
       [Filter1].[K1] AS [K1], 
       COUNT([Filter1].[A1]) AS [A1]
       FROM ( SELECT 
              convert (datetime2, convert(varchar(255), [Extent1].[LastLogIn], 102) ,  102) AS [K1], 
              1 AS [A1]
              FROM [dbo].[Users] AS [Extent1]
              WHERE (([Extent1].[LastLogIn] >= @p__linq__1) AND ([Extent1].[LastLogIn] <= @p__linq__2)
       )  AS [Filter1]
       GROUP BY [K1]
)  AS [GroupBy1]

0