c# - 如何将空组添加到 Linq 查询结果集中?

标签 c# .net linq

我有一个非常简单的查询,它根据匹配月份然后按天分组从表中选择项目。然后将这些组用作转发器的数据源,转发器将组元素输出为“每天”的条目。

问题是不存在的日子(即没有分组)自然不会显示,所以6号和8号的东西,当7号什么都没有的时候,会直接挨着看(想想日历 View )。问题是,根据下面的查询,即使当天没有条目,我如何插入没有元素的组?

IQueryable events = 
  Events
    .Where(i => i.Date.Month == date.Month)
    .GroupBy(i => i.Date.Day);

我可以事实之后弄清楚这一点,但是我可以解释它以立即获得结果集吗?还是可以推荐以前经过试验和测试的方法?

最佳答案

像这样创建你的结果集:

var date = ...;
var events = Enumerable.Range(1, DateTime.DaysInMonth(date.Year, date.Month))
    .ToDictionary(
        day => new DateTime(date.Year, date.Month, day),
        day => new List<Event>());

然后像这样插入:

var query = Events
    .Where(e => e.Date.Year == date.Year)
    .Where(e => e.Date.Month == date.Month);

foreach (var e in query)
    events[e.Date].Add(e);

如果您真的想将此服务器端作为查询的一部分,您要么需要 (A) 发送您感兴趣的日期列表作为查询的一部分,或者 (B) 使用特定于 DBMS 的函数来构建您对服务器端感兴趣的日期集。

具体到(B)和SQL,有这样的:Get the first and last date of next month in MySQL

我个人只会做这个客户端。数据库查询获取您的实现需要从数据库中提取的任何数据;用户获得您的观点 需要的任何信息。要在数据库中查询创建 View 所需的数据,您实际上不需要知道您所在月份的日期列表,因此它真的不应该成为查询的一部分。

关于c# - 如何将空组添加到 Linq 查询结果集中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17405045/

相关文章:

c# - 带有 Linq to XML 和 Distinct() 的 IEqualityComparer 不在代码中执行?

c# - Office 2007+ 功能区控件中的富文本框

c# - 何时检查 List<T> 是否为 null,何时检查 0 以及两者

c# - 多线程应用程序中的 SQLite "Database is locked"错误

c# - 在 Settings.settings 中保存属性

c# - 如何抑制 thread.abort() 错误 C#?

.net - WPF TextBox 不会填充 StackPanel

c# - 使用 LINQ 检索数据子集

c# - 属性值不会将值更新为 Xamarin Forms UI 中的标签

c# - YouTube和验证码