Linq groupby和全局计数(不是每个组的计数)

时间:2020-06-03 15:17:55

标签: linq entity-framework-core

我有以下查询:

var query = from incident in _dbContext.VehicleIncidents
                    join vehicle in _dbContext.Vehicles on incident.VehicleId equals vehicle.Id
                    where vehicle.EnterpriseId == enterpriseId
                    group incident by new {incident.ReportDate.Month, incident.ReportDate.Year}
                    into g1
                    orderby g1.Key.Year, g1.Key.Month
                    select new
                    {
                        Month = g1.Key.Month,
                        Year = g1.Key.Year,
                        Cost = g1.Sum(o => o.Cost)
                    };

它返回按月和年汇总的所有事件。但是我也需要事件总数。不是每个组的事件,而是总数。所有组的事件总数。可以在此查询中完成此操作,还是仅滚动另一个查询以获取总的全局计数更好?

1 个答案:

答案 0 :(得分:0)

我相信您可以得到每组的总和,然后再将其求和。像

var query = from incident in _dbContext.VehicleIncidents
                join vehicle in _dbContext.Vehicles on incident.VehicleId equals vehicle.Id
                where vehicle.EnterpriseId == enterpriseId
                group incident by new {incident.ReportDate.Month, incident.ReportDate.Year}
                into g1
                orderby g1.Key.Year, g1.Key.Month
                select new
                {
                    Month = g1.Key.Month,
                    Year = g1.Key.Year,
                    Cost = g1.Sum(o => o.Cost),
                    Count = g1.Count()
                };
var total = queryResult.SUM(x=>x.count);

我看到的另一种选择是加入一个子查询,请参见Join Subquery result in Linq

类似

var subquery = from incident in _dbContext.VehicleIncidents
                    join vehicle in _dbContext.Vehicles on incident.VehicleId equals vehicle.Id
                    where vehicle.EnterpriseId == enterpriseId
                    into g1
                    select new
                    {
                        Total = g1.Count()
                    };

var query = from incident in _dbContext.VehicleIncidents
                    join vehicle in _dbContext.Vehicles on incident.VehicleId equals vehicle.Id
join sub in subquery on 1=1
                    where vehicle.EnterpriseId == enterpriseId
                    group incident by new {incident.ReportDate.Month, incident.ReportDate.Year}
                    into g1
                    orderby g1.Key.Year, g1.Key.Month
                    select new
                    {
                        Month = g1.Key.Month,
                        Year = g1.Key.Year,
                        Cost = g1.Sum(o => o.Cost),
                        Count = sub.total
                    };