快速linq计数问题

时间:2011-01-31 21:03:51

标签: c# linq count

我有以下查询,它返回给定日期每天的登录计数。

var sot =   from uts in DataContext.UserTrackingStatistics
              let startDate = new DateTime(2009, 10, 01) 
              where uts.LastLogin >= startDate
              group uts by uts.LastLogin.Date into myGroup
              orderby myGroup.Key.Date
              select new { Count = myGroup.Count() , myGroup.Key.Date};

我想说这一天的计数是0,而不是没有返回任何东西。我怎么能在这个查询中做到这一点?

1 个答案:

答案 0 :(得分:5)

你不能只使用LINQ-to-SQL来实现它,因为你必须在查询中使用union实际上不存在的数据,LINQ-to-SQL可以'做。

要做到这一点,您需要填写客户端的空白。我现在不在VS面前,但一般的做法是:

  1. 定义您的日期范围(因为您在代码中未提及结束日期,我们正在谈论登录日期,我假设结束日期将是当前日期。
  2. 使用Enumerable.Range创建一个数字列表,范围从0到您日期范围内的天数,然后使用Select将该列表转换为日期列表。使用匿名类型选择结果,并使用与L2S语句相同的属性;这样,编译器将重用相同的类型
  3. Date属性
  4. 上使用外连接(不幸的是LINQ中最明显的语法)将列表组合在一起
  5. 按日期订购结果
  6. 现在这将显示0的差距。

    我会尝试在下面发布一个代码示例,但请注意我无法编译我的位置,因此可能需要进行调整。

    var allDates = Enumerable.Range(0, (DateTime.Today - startDate).TotalDays)
                  .Select(i => new { Count = 0, Date = startDate.AddDays(i) });
    
    var fullResults = from d in allDates
                      join r in results on d.Date == r.Date
                      from oj in r.DefaultIfEmpty()
                      select new { Count = oj == null ? 0 : oj.Count, Date = d.Date };