Linq组由多个列与匿名列

本文关键字:Linq | 更新日期: 2023-09-27 18:19:09

我不知道如何正确地表达这个问题,但我有:

            var groups = data.GroupBy(x => new {x.EntityId, x.StartLocal = new {
                var stamp = x.StartLocal;
                stamp = stamp.AddHours(-(stamp.Hour % hours));
                stamp = stamp.AddMinutes(-stamp.Minute);
                stamp = stamp.AddMilliseconds(-stamp.Millisecond);
                return stamp;
            }})
.Select(...)
            .ToList();

不起作用(语法错误)。我首先想按entityId分组,然后按StartLocal字段的小时分组,就像如果我每2小时对结果分组一样,我将得到:

Id = 1
     Hour = 2
     Hour = 4
Id = 2
     Hour = 2
...

需要填充的内容:

        DO obj = new DO
        {
            EntityId = pp.EntityId,
            EntityCode = pp.EntityCode,
            StartLocal = pp.StartLocal,
            Volume = pp.Volume,
        };

需要聚合的是Volume。所以基本上1000个DO作为一个数组出现然后它们被EntityId分割,然后是StartLocal的小时数。该体积被聚合为x小时值,并且创建了相同的DO…但是现在越来越少了。

Linq组由多个列与匿名列

你应该解释为什么你想在更高的层次上做这件事。也许还有其他(更好的)方法来完成你想做的事情。

从你做的事情来看,我觉得你只是想根据它们的id和开始的日期和时间来分组。您不需要尝试创建单个DateTime对象来表示日期和时间,只需分别获取组件即可。此外,很可能你的查询提供程序不支持复杂的选择器,这看起来不像一个LINQ到对象的查询。

就这样做:

var groups = data.GroupBy(x => new
    {
        x.EntityId,
        StartDate = x.StartLocal.Date,
        StartHour = x.StartLocal.Hour,
    })
    .Select(...)
    .ToList();

这里真正需要的是对GroupBy的调用,而不是对复杂对象的单个调用分组。

var query = data.GroupBy(item => item.EntityId)
    .Select(group => group.GroupBy(item => item.StartLocal));

这将给你一个深度为3的树,而不是2,或者换句话说,组的组

你似乎想要这样的东西:

var groups = data.GroupBy(x => 
    {
        var stamp = x.StartLocal;
        stamp = stamp.AddHours(-(stamp.Hour % hours));
        stamp = stamp.AddMinutes(-stamp.Minute);
        stamp = stamp.AddMilliseconds(-stamp.Millisecond);
        return new { x.EntityId, StartLocal = stamp };
    });

或者更简单:

var groups = data.GroupBy(x => new 
    { 
        x.EntityId, 
        StartLocal = new DateTime(
            x.StartLocal.Year, 
            x.StartLocal.Month, 
            x.StartLocal.Day, 
            x.StartLocal.Hour % hours, 0, 0)
    });

这两个都将StartLocal舍入到一个小时。如果只需要小时,可以这样做:

var groups = data.GroupBy(x => new { x.EntityId, x.StartLocal.Hour % hours });