代码之家  ›  专栏  ›  技术社区  ›  Collin Barrett

选择每个i组中的第一个,聚合某些属性而不显式指定每个非聚合属性

  •  0
  • Collin Barrett  · 技术社区  · 6 年前

    有没有办法选择每个元素的第一个元素 IGrouping 在聚合某些属性而不显式指定投影中的每个非聚合属性时?

    例如, SelectAggregatedFirstsOfMyThings() MyThing 大约有30处房产。我想把每个人的财产价值 MyIntA = x.First().MyIntA

    public class MyThing {
    
        public int MyFkId { get; set; }
        public int MyIntA { get; set; }
        public int MyIntB { get; set; }
        public DateTime MyDate {get; set; }
        ...
    }
    
    public class MyCaller {
        public IQueryable<MyThing> SelectAggregatedFirstsOfMyThings(IOrderedQueryable<MyThing> myThings) =>
            myThings.GroupBy(t => t.MyFkId)
                    .Select(g => new MyThing
                    {
                        MyIntA = g.First().MyIntA,
                        MyIntB = g.First().MyIntB,
                        MyDate = g.Max(d => d.MyDate)
                        ...
                    }
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   NetMage    6 年前

    可以使用语句lambda创建新的 MyThing First() ,然后重新分配聚合属性以创建所需的对象。因为您使用的是linqtosql,所以必须使用 AsEnumerable

    public IQueryable<MyThing> SelectAggregatedFirstsOfMyThings(IOrderedQueryable<MyThing> myThings) =>
        myThings.GroupBy(t => t.MyFkId)
                .AsEnumerable()
                .Select(g => {
                    var r = new MyThing(g.First());
                    r.MyDate = g.Max(d => d.MyDate);
                    // assign remaining aggregated properties ...
                    return r;
                 });