Linq group由多列匿名列组成

时间:2013-06-20 15:21:49

标签: c# linq group-by aggregate

我不知道如何正确地说出问题,但我有:

            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 ...但现在很多少了他们。

3 个答案:

答案 0 :(得分: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 });

答案 1 :(得分:0)

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

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

这样做:

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

答案 2 :(得分:0)

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

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

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