我目前正在解决一个问题,我想运行一个查询,该查询按所选日期对结果进行分组。
对于这个例子,想象一个像这样的简单模型:
public class User
{
public DateTime LastLogIn {get; set;}
public string Name {get; set;}
}
我正在寻找的解决方案是获取按日期登录的用户计数。
在数据库中,日期时间存储有日期和时间组件,但对于此查询,我实际上只关心日期。
我目前拥有的是这样的:
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();
然而上面返回一个空列表。
最终目标是拥有一个对象列表,其中包含一个值(一天登录的用户数)和一个日期(相关日期)
有什么想法吗?
将查询更改为:
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();
现在,它返回一个包含单个项目的列表,其中“值”是与 where 子句匹配的用户总数,“日”是第一天。按天看来还是没能分组
NOTE:事实证明上面的代码是正确的,我只是做了其他错误的事情。
它生成的 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]