首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >LINQ如何按日、月、年对数据进行分组

LINQ如何按日、月、年对数据进行分组
EN

Stack Overflow用户
提问于 2017-02-15 15:50:15
回答 3查看 974关注 0票数 0

我创建了一个使用日期(日、月、年)对数据进行分组的方法。

这是我的代码:

代码语言:javascript
复制
private IEnumerable<StatsticsVm> GetStatsticsPerDay(StatsticsQueryModel sqm)
{

    var messages = GetMessagesByDateAndIU(sqm);

    IEnumerable<StatsticsVm> messagesCountPerDay =

        from year in Enumerable.Range(sqm.From.Year, sqm.To.Year - sqm.From.Year + 1)
        from month in Enumerable.Range(1, 12)
        from day in Enumerable.Range(1, 31)
        let key = new { Year = year, Month = month, Day = day }
        join message in messages on key
        equals new
        {
            message.ObservationDateTime.Year,
            message.ObservationDateTime.Month,
            message.ObservationDateTime.Day
        } into g
        select new StatsticsVm()
        {
            Label = key.Day + "/" + key.Month + "/" + key.Year,
            MessagesCount = g.Count()
        };

    return messagesCountPerDay;

}

我的问题是:这个方法有一个bug,bug的结果总是包含12个月零31天,我希望结果就像过滤器一样。

例如,如果我只需要第1天到第15天的数据,我总是得到从第1天到第31天的组。几个月也是如此。

注意:我也希望所有的日子,包括在我的过滤器,即使这一天有0条消息。这已经在这个方法中完成了。

EN

回答 3

Stack Overflow用户

发布于 2017-02-15 16:34:02

好吧,我想我终于抓到你了。

您的问题在于尝试创建DateTime范围的方式。

正确的方法是这样:

代码语言:javascript
复制
Enumerable.Range(0, 1 + sqm.To.Subtract(sqm.From).Days)
          .Select(offset => sqm.From.AddDays(offset))

这将为您提供以下代码:

代码语言:javascript
复制
private IEnumerable<StatsticsVm> GetStatsticsPerDay(StatsticsQueryModel sqm)
{

    var messages = GetMessagesByDateAndIU(sqm);
    var dateRange = Enumerable.Range(0, 1 + sqm.To.Subtract(sqm.From).Days)
                              .Select(offset => sqm.From.AddDays(offset));

    IEnumerable<StatsticsVm> messagesCountPerDay =
        from date in dateRange
        join message in messages on date
        equals message.ObservationDateTime into g
        select new StatsticsVm()
        {
            Label = date.Day + "/" + date.Month + "/" + date.Year,
            MessagesCount = g.Count()
        };

    return messagesCountPerDay;

}
票数 0
EN

Stack Overflow用户

发布于 2017-02-15 17:04:48

据我所知,您要做的是获取日期范围内的消息,按日期对它们进行分组,并计算每个日期的计数。

代码语言:javascript
复制
from messages in  message
where (messages .ObservationDateTime < sqm.To) 
           && (messages .ObservationDateTime > sqm.From))
group orders by EntityFunctions.TruncateTime(m.ObservationDateTime) 
           into dateMessages
select new StatsticsVm()
    {
        Label = dateMessages.key.Day + "/" + dateMessages.key.Month + "/" + dateMessages.key.Year,
        MessagesCount = dateMessages.Count()
    };
票数 0
EN

Stack Overflow用户

发布于 2017-02-15 18:27:00

我想这对你来说是可行的:

代码语言:javascript
复制
private IEnumerable<StatsticsVm> GetStatsticsPerDay(StatsticsQueryModel sqm)
{
    var messages = GetMessagesByDateAndIU(sqm);

    var f = new DateTime(sqm.From.Year, 1, 1);
    var t = new DateTime(sqm.To.Year + 1, 1, 1);

    var lookup = messages.ToLookup(x => x.ObservationDateTime.Date);

    IEnumerable<StatsticsVm> messagesCountPerDay =
        from n in Enumerable.Range(0, t.Subtract(f).Days)
        let day = f.AddDays(n)
        select new StatsticsVm()
        {
            Label = day.ToString(@"d/m/y"),
            MessagesCount = lookup[day].Count()
        };

    return messagesCountPerDay;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42243447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档