我有以下查询,它返回给定日期每天的登录计数。
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,而不是没有返回任何东西。我怎么能在这个查询中做到这一点?
答案 0 :(得分:5)
你不能只使用LINQ-to-SQL来实现它,因为你必须在查询中使用union
实际上不存在的数据,LINQ-to-SQL可以'做。
要做到这一点,您需要填写客户端的空白。我现在不在VS面前,但一般的做法是:
Enumerable.Range
创建一个数字列表,范围从0到您日期范围内的天数,然后使用Select
将该列表转换为日期列表。使用匿名类型选择结果,并使用与L2S语句相同的属性;这样,编译器将重用相同的类型Date
属性现在这将显示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 };