我有一组基本上具有这种结构的实体。
{Stats Name="<Product name> (en)" TotalResources="10" ..}
{DayStats Date="2009-12-10" TotalResources="5"}
{DayStats Date="2009-12-11" TotalResources="5"}
{Stats}
{Stats Name="<Product name> (us)" TotalResources="10" ..}
{DayStats Date="2009-12-10" TotalResources="5"}
{DayStats Date="2009-12-11" TotalResources="5"}
{Stats}
...
我想从这个集合中提取的是一个新的集合实体(或上面例子中的实体),其中第一个级别已经被(忽略国家标签)分组,其中所有/部分属性已被汇总在一起,包括每天{DayStas}的子列表。所以示例的结果集看起来像这样:
{Stats Name="<Product name>" TotalResources="20" ..}
{DayStats Date="2009-12-10" TotalResources="10"}
{DayStats Date="2009-12-11" TotalResources="10"}
{Stats}
...
所以我的问题是:是否有可能在LINQ中以更优雅的方式执行此操作而不是香草“loop-trhough-each-entity-and-compare”-way?
而且我不想包含与原始集合({Stats},{DayStats})相同类型的实体,你的答案不需要包含代码,我可以通过我。只是让你知道,你需要考虑到这一点。
(如果之前已经讨论过这个问题,我很抱歉,我尝试搜索无效。我猜我的搜索技巧是fuubar;)
圣诞快乐=)
答案 0 :(得分:0)
尝试:
dataset.SelectMany(p => new {stat=p, daystats=p.DayStats)
.GroupBy(c => c.stat.Name.SubString(0, c.stat.Name.Length - 5))
答案 1 :(得分:0)
有点晚,但可能仍然有用。 RemoveCountry应该是一个扩展方法,它返回没有国家后缀的统计信息的名称。
IEnumerable<Stats> aggregated =
from stat in stats
group stat by stat.Name.RemoveCountry() into grp
select new Stats
{
Name = grp.Key,
TotalResources = (from stat in grp select stat.TotalResources).Sum(),
DayStats = (from stat in grp
from dayStat in stat
group dayStat by dayStat.Date into dgrp
select new DayStats
{
Date = dgrp.Key,
TotalResources = (from dayStat in dgrp select dayStat.TotalResources).Sum()
}).ToList()
};