C# LINQ如何按日期、日期、月份和年份对数据进行分组

C# LINQ如何按日期、日期、月份和年份对数据进行分组,c#,linq,grouping,C#,Linq,Grouping,我创建了一个使用日期(日、月、年)对数据进行分组的方法 这是我的代码: private IEnumerable<StatsticsVm> GetStatsticsPerDay(StatsticsQueryModel sqm) { var messages = GetMessagesByDateAndIU(sqm); IEnumerable<StatsticsVm> messagesCountPerDay = from year in

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

这是我的代码:

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;

}
private IEnumerable GetStatsticsPerDay(StatsticsQueryModel sqm)
{
var消息=GetMessagesByDateAndIU(平方米);
每天可数信息=
可枚举范围中的起始年份(平方米起始年份,平方米至年份-平方米起始年份+1)
从可枚举范围(1,12)中的月份开始
可枚举范围(1,31)中的起始日期
让key=new{Year=Year,Month=Month,Day=Day}
在密钥上的消息中加入消息
等于新的
{
message.ObservationDateTime.Year,
message.ObservationDateTime.Month,
message.ObservationDateTime.Day
}进入g
选择新StatsticsVm()
{
Label=key.Day+“/”+key.Month+“/”+key.Year,
messagescont=g.Count()
};
每天返回消息;
}
我的问题是:这个方法有一个错误,错误是结果总是包括12个月31天,我希望结果就像过滤器一样

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


注意:我还希望筛选中包含的所有日期,即使该日期有0条消息。这个方法已经完成了。

好的,我想我终于找到你了

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

正确的方法是这样的:

Enumerable.Range(0, 1 + sqm.To.Subtract(sqm.From).Days)
          .Select(offset => sqm.From.AddDays(offset))
这将为您提供以下代码:

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;

}
private IEnumerable GetStatsticsPerDay(StatsticsQueryModel sqm)
{
var消息=GetMessagesByDateAndIU(平方米);
var dateRange=可枚举的.Range(0,1+sqm.To.Subtract(sqm.From).Days)
.Select(offset=>sqm.From.AddDays(offset));
每天可数信息=
日期范围中的起始日期
在日期的邮件中加入邮件
等于message.ObservationDateTime到g
选择新StatsticsVm()
{
标签=日期.日+“/”+日期.月+“/”+日期.年,
messagescont=g.Count()
};
每天返回消息;
}

据我所知,您试图做的是在日期范围内记录消息,按日期分组,并记录每个日期的计数

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()
    };
来自消息中的消息
其中(messages.ObservationDateTimesqm.From))
按EntityFunctions.TruncateTime(m.ObservationDateTime)对订单进行分组
转换成日期信息
选择新StatsticsVm()
{
Label=dateMessages.key.Day+“/”+dateMessages.key.Month+“/”+dateMessages.key.Year,
messagescont=dateMessages.Count()
};

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

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;
}
private IEnumerable GetStatsticsPerDay(StatsticsQueryModel sqm)
{
var消息=GetMessagesByDateAndIU(平方米);
var f=新日期时间(平方米自年,1,1);
var t=新日期时间(平方米到年份+1,1,1);
var lookup=messages.ToLookup(x=>x.ObservationDateTime.Date);
每天可数信息=
从可枚举范围内的n开始(0,t.减去(f).天)
let day=f.AddDays(n)
选择新StatsticsVm()
{
Label=日期ToString(@“d/m/y”),
messagescont=lookup[day].Count()
};
每天返回消息;
}

你是说你想把所有的日子都包括在内,那么为什么所有的月份和日子都有问题呢?“我希望结果与过滤器一样”是什么意思?我的意思是,我只想要(年、月、日),即使这些天没有消息。这里的错误是,即使我的过滤器是从第3个月到第12个月,结果总是从第1个月到第12个月,从第1天到第31天。我希望我现在能说清楚。从第13天到第31天?这有点不清楚,您应该将方法min和max month以及min和max day传递给min和max month。我不明白,我刚刚尝试了您的代码,并且完全按照您的要求执行,包括筛选和外部联接。或者您的问题是您没有使用sqm来表示月份和日期?@OfirWinegarten是的,这是我的问题,我正在尝试解决它。但是如果日期为0,但没有消息,我希望它也在结果中,计数为0。