快速linq计数问题

Mik*_*den 3 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};
Run Code Online (Sandbox Code Playgroud)

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

Ada*_*son 5

你不能只使用LINQ-to-SQL,因为你必须union在查询中使用实际上不存在的数据,LINQ-to-SQL不能这样做.

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

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

现在,这将显示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 };
Run Code Online (Sandbox Code Playgroud)