Linq - 按日期分组并选择计数
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]