我坚持编写LINQ查询来计算在X天之前或之后创建的项目。
我有下表Items
:
id dateline (timestamp) lastactivity status
-----------------------------------------------------
1 1448395260 1448395260 done
2 1448308860 1448308999 in_progress
3 1448308860 1448395260 done
4 1448222460 1448395260 done
5 1448395260 1448395260 in_progress
我正在尝试编写LINQ查询以获取过去X天每天创建和现有in_progress项目的数量。
如果项目是dateline <= DAY_END (23:59:59) AND (status != 'done' OR lastactivity >= DAY_START (00:00:00))
,则会计算项目
如果项目的日期行少于特定日期并且当天关闭,则必须计算。
根据上表中的项目,预期结果应该是这样的:
day not_done_items_count
-----------------------------------
1448409599 5
1448323199 3
1448236799 1
(对于day
值DAY_END
时间戳。)
我当前的LINQ查询如下所示:
var itemsPerDay = (from item in items
from i in Enumerable.Range(0, totalDays)
let dayStart = start.AddDays(i).ToUnixTimestamp()
let nextDay = start.AddDays(i).NextDay().ToUnixTimestamp()
where (item.dateline < nextDay
&& (!item.status.Equals("done") || t.lastactivity >= dayStart)
select new { day = nextDay - 1 }
).ToList();
var results = itemsPerDay.DistinctBy(t => t.day).Select(
t => new OpenedItemsPerDay
{
day = t.day,
count = itemsPerDay.Count(v => v.day == t.day)
}).AsQueryable();
上面的代码执行得太慢,我不确定这是否是一种正确的方法来做我想做的事。
我也试着玩分组但是坚持:如果项目是早先创建的那么DAY_X并且它的状态改为完成例如2天我只能将它与一个组(日)联系起来后,我无法计算它两次或更多。
答案 0 :(得分:0)
为什么不使用groupby? (并非面对vs如此原谅语法)
var d1 = datetime.now.adddays(-5).ToUnixTimestamp()
var d2= DateTime.Now.ToUnixTimestamp();
var grouppeditems = (for item in items
where item.lastactivity <= d2 && item.dateline >= d1 && (!item.status.Equals("done")
select item).GroupBy(gb=>gb.lastactivity)
foreach (var item in grouppeditems )
Console.WriteLine ( item.Title + " " + item.Count);
//可能想要通过这样的事情进行分组,以便在同一天进行分组 (D2-gb.lastactivity)/ 86400