1

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

            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……但现在很多少一些。

4

3 回答 3

0

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

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

这将为您提供深度为 3 的树,而不是两个,或者换句话说,组的组。

于 2013-06-20T15:35:55.857 回答
0

看起来你想要这样的东西:

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 });
于 2013-06-20T15:29:38.737 回答
0

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

从你正在做的事情来看,在我看来你只是想按它们的 id 以及它开始的日期和时间对项目进行分组。您无需尝试创建单个 DateTime 对象来表示日期和小时,只需分别获取组件即可。此外,您的查询提供程序可能不支持复杂的选择器,这看起来不像 LINQ to objects 查询。

只需这样做:

var groups = data.GroupBy(x => new
    {
        x.EntityId,
        StartDate = x.StartLocal.Date,
        StartHour = x.StartLocal.Hour,
    })
    .Select(...)
    .ToList();
于 2013-06-20T15:35:20.143 回答