31

現在、選択した日付で結果をグループ化するクエリを実行したいという問題に取り組んでいます。

この例では、次のような単純なモデルを想像してください。

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] 
4

6 に答える 6

30

そこに2番目は必要ありませんTruncateTime

context.Users
    .Where((x.LastLogIn  >= lastWeek) && (x.LastLogIn <= DateTime.Now))
    .GroupBy(x => DbFunctions.TruncateTime(x.LastLogIn))
    .Select(x => new
    {
        Value = x.Count(),
        // Replace the commented line
        //Day = (DateTime)DbFunctions.TruncateTime(x.Key)
        // ...with this line
        Day = (DateTime)x.Key
    }).ToList();

はすでにGroupByからの時間を切り捨てたDateTimeので、もう一度呼び出す必要はありません。

使用するには、アセンブリを参照して含めるDbFunctions.TruncateTime必要がありますSystem.Data.Entityusing System.Data.Entity;

注:の非推奨に対処するために編集されましたEntityFunctions

于 2013-10-07T15:24:37.110 に答える
4

簡単にできます:

yourDateList.GroupBy(i => i.ToString("yyyyMMdd"))
             .Select(i => new
             {
                 Date = DateTime.ParseExact(i.Key, "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None),
                 Count = i.Count()
             });
于 2015-11-11T15:30:57.457 に答える
2

日時列によるグループに基づいてカウントを取得するために、この同じ問題に遭遇しました。これが私がしたことです。ここでいくつかの答えをありがとう。最小バージョンを試し、このコードを .netcore ソリューションで使用しました。

var result = _context.yourdbmodel
              .GroupBy(x=>x.yourdatetimecolumn.Value.Date)
              .select(x=> new 
              {
                Count = x.Count(),
                Date = (DateTime)x.Key // or x.Key.Date (excluding time info) or x.Key.Date.ToString() (give only Date in string format) 
              })
              .ToList();

出力例:

[ { "requestDate": "2020-04-01", "requestCount": 3 }, { "requestDate": "2020-04-07", "requestCount": 14 } ]

これが将来誰かに役立つことを願っています。

于 2020-04-14T07:06:49.603 に答える