在X天之前或之后创建的LINQ计数项目

时间:2015-11-24 18:55:29

标签: c# linq linq-to-entities

我坚持编写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

(对于dayDAY_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天我只能将它与一个组(日)联系起来后,我无法计算它两次或更多。

1 个答案:

答案 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