gpt4 book ai didi

c# - 快速linq计数问题

转载 作者:行者123 更新时间:2023-11-30 15:09:04 24 4
gpt4 key购买 nike

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

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,而不是不返回任何内容。我怎么能在这个查询中做到这一点?

最佳答案

你不能仅使用 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 };

关于c# - 快速linq计数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4856066/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com