В настоящее время я работаю над проблемой, когда я хотел бы запустить запрос, который группирует результаты по выбранной дате.
В этом примере представьте себе такую простую модель:
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();
Приведенное выше возвращает пустой список.
Конечная цель состоит в том, чтобы иметь список объектов, которые содержат значение (количество зарегистрированных пользователей в день) и день (день, о котором идет речь)
Любые мысли?
После изменения запроса на:
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, а день - самый первый день. Кажется, он все еще не мог группироваться по дням.
ПРИМЕЧАНИЕ: оказывается, что приведенный выше код прав, я просто делал что-то еще не так.
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]