linq - 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 |
解决方案
该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;
}
推荐阅读
- .net - Linq Select 不会在 EF Core 中检索超过 3 个子级别的对象数据
- angular-material - 我可以将 mat-form-field 外包为自定义组件或指令吗?
- excel - 将字符添加到以数字开头的单元格的开头
- log4net - Log4net ADOAppender 使用 Azure MSI 连接而不是普通连接字符串
- vue.js - .then(Response => SyntaxError: Unexpected token ., in Vue js
- reactjs - 将 react-redux useSelector 与打字稿一起使用
- python - 使用 jinja 模板从模型中加载图像
- typescript - 将 vue.js 类型添加到现有打字稿文件的最简单方法是什么?
- wpf - 为不同的窗口设置不同的绑定数据上下文
- powershell - 为 PowerShell 函数编写测试