如何将空组添加到Linq查询结果集?

时间:2013-07-01 12:57:45

标签: c# .net linq

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

问题在于,不存在的日子(即没有任何组合)将自然不会被显示,所以第6和第8的东西,当第7个没有任何内容时,将直接看到彼此(想到日历视图)。问题是,根据我的查询,我怎么能插入没有元素的组,即使当天没有条目?

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

我可以在之后找出这个事实,但是我可以考虑它来立即获得结果集吗?或者以前尝试过的&建议使用经过测试的方法吗?

1 个答案:

答案 0 :(得分:2)

像这样创建结果集:

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

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