2017-01-07 17 views
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日目の午前9時から午後17時まで。 "毎日1時間に何回訪問するのか"、他の日にも。 私の質問がはっきりすることを願っていますか?

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; } 

} 

答えて

0

もともと同じです。 EntityFunctions.TruncateTime(v.VisitDay)でグループ化することで時間全体を削除していますが、分単位で削除するだけで済みます。

使用この私はそれが(私はVisitDayプロパティは、訪問の日付と時刻の値が含まれていることを前提としています。)に役立ちます願っています:

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); 
    } 
+0

intへのキャストが機能しなかった場合は、代わりに '-v.VisitDay.Ticks'を試してください。 – Emad

+0

dear @emad私は、時間を基準にして各日付グループで日付順にグループを作成したい。 – Afsaneh

+0

@Afsanehあなたはそれが何を意味するのか分かりませんか?あなたがマイナーなグループ分けをしているなら、あなたはメジャーなものを持っています。例えば、あなたはすでに(5,7,4)を3日間持っています。今、あなたは1時間に(1,0,0,2,2,5,1,0,0,1,1,2,0,0)を得るでしょう。毎時の結果が必要です – Emad

0

私は時間に基づいて、各日付のグループに、日付でグループをしたいです。

ですから、1日2回以内時間のグループを取得する2番目の時間を日のグループを取得するための最初の時間をGroupByを使用する必要があります、私はここにSystem.Data.Entity.SqlServer.SqlFunctionsを使用することを

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()) 
       }; 

ない理由正規の関数DATEPARTにマップするDatePart関数が含まれています。また、EntityFunctionsを使用します。 EFの新しいバージョンを使用している場合は、これをDbFunctionsに変更する必要があります。

返された匿名型の構造を見て、StatisticItemDtoを再定義することにします。

関連する問題