我有一个非常简单的查询,它根据匹配月份然后按天分组从表中选择项目.然后将这些组用作转发器的数据源,该转发器将组元素输出为"每天"条目.
问题是那些不存在的日子(即没有任何组合)将自然不会被显示出来,所以第6和第8的东西,当第7个没什么东西时,将直接看到彼此(想想一个日历视图).问题是,根据我的查询,我怎么能插入没有元素的组,即使当天没有条目?
IQueryable events =
Events
.Where(i => i.Date.Month == date.Month)
.GroupBy(i => i.Date.Day);
Run Code Online (Sandbox Code Playgroud)
我可以在事后弄清楚这个,但我可以解释它来立即得到结果集吗?或者可以推荐以前久经考验的方法吗?
像这样创建结果集:
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>());
Run Code Online (Sandbox Code Playgroud)
然后像这样插入:
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);
Run Code Online (Sandbox Code Playgroud)
如果您确实想在服务器端执行此操作作为查询的一部分,则需要 (A) 作为查询的一部分发送您感兴趣的日期列表,或者 (B) 使用 DBMS 特定的函数构建您对服务器端感兴趣的日期集。
具体到(B)和SQL,有这样的事情:在MySQL中获取下个月的第一个和最后一个日期
我个人只会做这个客户端。数据库查询获取您的实现需要从数据库中提取的任何数据;用户可以获得您的视图所需的任何信息。要在数据库中查询创建视图所需的数据,您实际上不需要知道月份中的日期列表,因此它实际上不应该成为查询的一部分。