0

見本市の訪問日を格納するテーブルがあります。たとえば、訪問者は「a」日から「b」日まで見本市に訪れます。訪問日に基づいてクエリ ウインチ グループを作成しました。しかし、それは「1日あたりの訪問数」を教えてくれます。

ここに私のクエリがあります:

var visitDays = from v in _dbContext.VisitorEvents
                         join e in _dbContext.VisitorEvents on v.VisitorId equals e.VisitorId
                         where e.EventId == eventId
                         group v by EntityFunctions.TruncateTime(v.VisitDay) into g
                         select new StatisticItemDto()
                         {
                             Name = g.Key.ToString(),
                             Value = g.Count()
                         };
         total =visitDays.Any()? visitDays.Sum(x => x.Value):0;
         foreach (var item in visitDays)
         {
             item.Percent = Framework.Utility.GetPercent(item.Value, total);
         }

しかし、私はこのクエリ以上のものを求めていますか? 1 日 1 時間あたりの訪問者数を意味します。例 1 日目の午前 9:00 から午後 17:00 まで。「毎日の毎時間の訪問数」および他の日についても。私の質問が明確であることを願っていますか?

 public class StatisticItemDto
{
    public string Name { get; set; }
    public int Value { get; set; }
    public int Percent { get; set; }
    public int Total { get; set; }
    public List<StatisticItemDto> Hours { get; set; }

}
4

2 に答える 2

0

日付ごとにグループ化してから、時間に基づいて各日付グループに入れます。

したがって、2 回使用する必要がありますGroupBy。1 回目は日のグループを取得し、2 回目は各日の時間のグループを取得します。

var visitDays = from v in _dbContext.VisitorEvents
                join e in _dbContext.VisitorEvents on v.VisitorId equals e.VisitorId
                where e.EventId == eventId
                group v by EntityFunctions.TruncateTime(v.VisitDay) into g
                select new
                {
                    Name = g.Key.ToString(),
                    Value = g.GroupBy(v => SqlFunctions.DatePart("HH", v.VisitDay))
                             .Select(h => h.Key, Count = h.Count())
                };

正規の関数にマップする関数がSystem.Data.Entity.SqlServer.SqlFunctions含まれているため、ここでは使用しません。また、使用します。新しいバージョンの EF を使用している場合は、これを に変更する必要があります。DatePartDATEPARTEntityFunctionsDbFunctions

返された匿名型の構造を見て、再定義するかどうかを決めるのはあなたに任せますStatisticItemDto

于 2017-01-07T21:22:08.967 に答える
0

まあ校長は同じだ。グループ化で時間部分全体を削除してEntityFunctions.TruncateTime(v.VisitDay)いますが、分と秒以降を削除するだけです。

VisitDayこれを使用してください (プロパティには訪問の DateTime 値が含まれていると想定しています)。

var visitDays = from v in _dbContext.VisitorEvents
                     join e in _dbContext.VisitorEvents on v.VisitorId equals e.VisitorId
                     where e.EventId == eventId
                     group v by EntityFunctions.AddMicroseconds(v.VisitDay, -(int)v.VisitDay) into g
                     select new StatisticItemDto()
                     {
                         Name = g.Key.ToString(),
                         Value = g.Count()
                     };
     total =visitDays.Any()? visitDays.Sum(x => x.Value):0;
     foreach (var item in visitDays)
     {
         item.Percent = Framework.Utility.GetPercent(item.Value, total);
     }
于 2017-01-07T08:34:07.980 に答える