現在、選択した日付で結果をグループ化するクエリを実行したいという問題に取り組んでいます。
この例では、次のような単純なモデルを想像してください。
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();
ただし、上記は空のリストを返します。
最終的な目標は、値 (1 日にログインしたユーザーの数) と日 (問題の日) を含むオブジェクトのリストを持つことです。
何かご意見は?
クエリを次のように変更すると:
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]