0

次の LINQ-to-SQL を作成して、1 日ごとに合計レコード数を取得できるようにしました。

私のニーズに合うようにするために、いくつかの変更を加えたいと思います。いろいろ試してみましたが、うまくいきません。

この期間に「開封」がなかったとしても、過去 9 日間をリストしたいと思います。また、以下で行っているように、日だけでなく日/月でグループ化したいと思います。

私が取得したい出力の例は次のとおりです。

DateString   Opens
===================
 9/5         0
10/5         0
11/5         3

等...

public List<OpensOverTimeViewModel> GetOpensOverTimeViewModel(int eId)
{

    DateTime lastDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day).AddDays(-9);
    DateTime currentDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day).AddDays(1);

    var summary = (from p in db.Opens
                    where (p.ElementId == eId) && (p.Timestamp >= lastDate) && (p.Timestamp <= currentDate)
                    let k = new
                    {
                        Day = p.Timestamp.Day
                    }
                    group p by k into t
                    select new OpensOverTimeViewModel
                    {
                        DateString = t.Key.Day,
                        TotalOpens = t.Count(),
                        ElementName = ""
                    }).ToList();

    return summary;
}

これに取り組む最善の方法についての助けをいただければ幸いです。

4

1 に答える 1

1

データベースから結果を取得した後、コードで左結合を作成できます

以下の行を行の直前に置きますreturn summary;

var allDates = from idx in Enumerable.Range(0, (currentDate - lastDate).Days)
               select lastDate.AddDays(idx);

summary = (
          from allDate in allDates
          join su in summary on allDate.Day equals su.DateString into x
          from su in x.DefaultIfEmpty()
          select new OpensOverTimeViewModel
          {
              DateString = allDate.Day,
              TotalOpens = su == null ? 0 : su.TotalOpens,
              ElementName = ""
          }).ToList();

日/月ごとにグループ化するには、日付全体を使用し、 に置き換えt.Key.Dayt.Key.Dateに変更DateStringすることをお勧めしDateTimeます。

于 2012-06-12T04:17:19.960 に答える