在 LINQ to SQL 查询中按日期获取记录数,即使没有结果也是如此

本文关键字:结果 取记录数 SQL to LINQ 查询 日期 | 更新日期: 2023-09-27 18:36:56

我编写了以下 LINQ-to-SQL,使我能够按天获取记录总数。

我想对它进行一些修改,以使其符合我的需求。我已经做了各种尝试,但都没能做到正确。

我想列出过去 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;
}

有关如何最好地解决此问题的任何帮助将不胜感激。

在 LINQ to SQL 查询中按日期获取记录数,即使没有结果也是如此

从数据库获取结果后,可以在代码中创建左联接

将以下行放在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.Date替换t.Key.Day并将DateString更改为DateTime