将对象模型列表映射到另一个单个对象

时间:2016-12-20 09:07:22

标签: c# linq collections aggregate

是否可以从IQueryable<Change>集合和Sum()此集合中的某些字段中获取一个对象? 我写了这段代码:

Changes.Aggregate(new TaskInfo(), (info, change) => new TaskInfo
{
    TaskId= change.TaskId,
    UserId = change.UserId,
    Hours = info.Hours + change.BaseDiff,
    EffectiveHours = info.EffectiveHours + change.Diff
    // Other fields..
});

我知道我的收藏集包含TaskIdUserId字段的相同值。 我想我可以这样做:

var result = new TaskInfo();
foreach (var change in Changes.AsEnumerable())
{
    result.TaskId = change.TaskId;
    result.UserId = change.UserId;
    result.Hours += change.BaseDiff;
    ///... other fields
}

由于构建新的额外对象,第一个解决方案看起来并不漂亮,而第二个解决方案因为每次迭代都设置了 Ids 字段。有没有更好的解决方案?

1 个答案:

答案 0 :(得分:1)

您可以像这样使用Linq Query:

    from c in Changes
    group c by new {c.TaskId, c.UserId} into g
    select new TaskInfo(){
      UserId = g.Key.UserId,
      TaskId = g.Key.TaskId,
      Hours = g.Sum(x => x.BaseDiff),
      EffectiveHours = g.Sum(x => x.Diff)
    }