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…但是现在越来越少了。
你应该解释为什么你想在更高的层次上做这件事。也许还有其他(更好的)方法来完成你想做的事情。
从你做的事情来看,我觉得你只是想根据它们的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 });