ASP.NET MVC停车系统:如何用Linq Group By统计时段停车车辆数
使用C# LINQ实现停车时长时段统计
1. 定义对应的数据实体类
先把SQL表的记录映射为C#实体类,方便LINQ操作:
public class ParkingRecord { public string LicencePlate { get; set; } public DateTime EntryTime { get; set; } public DateTime DepartureTime { get; set; } public int SerialCode { get; set; } }
2. 核心实现步骤
假设你已从数据库获取到所有停车记录集合List<ParkingRecord> allRecords,按以下步骤完成统计:
步骤1:过滤特定日期的记录
先筛选出目标日期内的记录(示例以离场日期为筛选条件,可根据业务需求改为入场日期):
DateTime targetDate = new DateTime(2022, 9, 2); // 要统计的目标日期 var targetRecords = allRecords.Where(r => r.DepartureTime.Date == targetDate.Date);
步骤2:计算停车时长并分组
根据业务需求选择对应分组逻辑:
场景A:统计各时长区间的车辆数(如0-1h、1-2h、2h以上)
var durationGroups = targetRecords .Select(r => new { r.LicencePlate, ParkingHours = r.DepartureTime.Subtract(r.EntryTime).TotalHours }) .GroupBy(x => x.ParkingHours switch { <= 1 => "0-1小时", <= 2 => "1-2小时", _ => "2小时以上" }) .Select(g => new { DurationRange = g.Key, VehicleCount = g.Count() });
场景B:精确统计接近特定时长的车辆数(如停车时长约1小时)
考虑到秒级误差,用范围判断筛选:
var oneHourCount = targetRecords .Count(r => r.DepartureTime.Subtract(r.EntryTime).TotalHours is >= 0.95 and <= 1.05);
场景C:按整数小时向上取整统计
var roundedHourGroups = targetRecords .Select(r => new { RoundedHours = Math.Ceiling(r.DepartureTime.Subtract(r.EntryTime).TotalHours) }) .GroupBy(x => x.RoundedHours) .Select(g => new { Hours = g.Key, VehicleCount = g.Count() });
步骤3:输出统计结果
遍历分组结果即可生成报表数据:
foreach (var group in durationGroups) { Console.WriteLine($"时段:{group.DurationRange},车辆数:{group.VehicleCount}"); }
关键说明
- 时间差计算:
TotalHours返回带小数的精确小时数;若仅需整数小时,可使用Hours属性(会丢失分钟、秒级信息)。 - 过滤逻辑可灵活调整:比如要统计“今日入场”的车辆,只需把过滤条件改为
r.EntryTime.Date == targetDate.Date。 - 分组粒度可自定义:如需按30分钟为一个时段,修改
GroupBy的判断条件即可。
内容的提问来源于stack exchange,提问作者Emil Shkurti
相关产品推荐
相关产品推荐

