首页 > 解决方案 > C# 嵌套 Linq 分组方式

问题描述

我想为每个客户实现这个输出,一个 VIEWMODEL 实例

顾客
途易
日期 乘客 血管
2021 年 1 月 5 日 2 晨星
2021 年 1 月 5 日 7 约翰船长
2021 年 1 月 5 日 10 约翰船长
血管 乘客
约翰船长 17
晨星 2
全部的 19

这是模型

public class Reservation {
    public string Date { get; set; }
    public string Destination { get; set; }
    public string Customer { get; set; }
    public string Vessel { get; set; }
    public int TotalPersons { get; set; }
}

这是到目前为止的视图模型

public class ReservationVM {
    public string Customer { get; set; }
    public List<Reservation> Reservations { get; set; }
}

到目前为止,我只能创建包含客户和预订的列表

顾客
途易
日期 乘客 血管
2021 年 1 月 5 日 2 晨星
2021 年 1 月 5 日 7 约翰船长
2021 年 1 月 5 日 10 约翰船长

代码

public IEnumerable<ReservationVM> Get() {
   var result = dbContext.Reservations
                .Where(x => x.Date == "2021-05-01")
                .AsEnumerable()
                .GroupBy(x => x.Customer)
                .Select(x => new ReservationVM {
                    Customer = x.Key,
                    Reservations = x.ToList()
                })
                .OrderBy(x => x.Customer);
   return result;
}

我怎么能包括显示每艘船的总乘客数的部分?

血管 乘客
约翰船长 17
晨星 2
全部的 19

标签: linqgroup-by

解决方案


Total字段必须在级别ReservationVM(除非您想要一个名为 的容器Total,但您不需要)。另外,您应该创建另一个类,我们称之为VesselReservationVm。您可以执行以下操作:

课程:

public class Reservation {
    public string Date { get; set; }
    public string Customer { get; set; }
    public string Vessel { get; set; }
    public int TotalPersons { get; set; }
}

public class ReservationVM {
    public string Customer { get; set; }
    public List<Reservation> Reservations { get; set; }
    public List<VesselReservationVM> VesselReservations { get; set; }
    public int Total { get; set; }
}
    
public class VesselReservationVM {
    public string Vessel { get; set; }
    public int Passengers { get; set; }
}

方法:

public IEnumerable<ReservationVM> GetCustomersReservations() {
   var result = dbContext.Reservations
                .Where(x => x.Date == "2021-05-01")
                .AsEnumerable()
                .GroupBy(x => x.Customer)
                .Select(x => new ReservationVM {
                    Customer = x.Key,
                    Reservations = x.ToList(),
                    VesselReservations = GetCustomerVessels(x.ToList()),
                    Total = x.Select(r => r.TotalPersons).Sum()
                })
                .OrderBy(x => x.Customer);
   return result;
}

public List<VesselReservationVM>  GetCustomerVessels( 
  List<Reservation> reservations) {
   var result = reservations
           .GroupBy(r => r.Vessel)
           .Select(g => new VesselReservationVM
           {
              Vessel = g.Key,
              Passengers = g.Select(r => r.TotalPersons).Sum(),
           })
           .ToList();
    return result;
}

推荐阅读