【问题标题】:Linq groupby and global count (not count per group)Linq groupby 和全局计数(不是每组计数)
【发布时间】:2020-06-03 15:17:55
【问题描述】:

我有以下疑问:

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)
                    };

它返回按月和年聚合的所有事件。但我也需要事件总数。不是每个组的事件,而是总数。所有组的事件的总和。这可以在这个查询中完成,还是只滚动另一个查询以获得全局总数更好?

【问题讨论】:

    标签: linq entity-framework-core


    【解决方案1】:

    我相信您可以得到每组的总和,然后将它们相加。类似的东西

    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
                        };
    

    【讨论】:

    • 原来如此,我也是这么想的。但想知道是否一切都可以在数据库端完成。如果没有人提出更好的解决方案,我会接受。谢谢。
    猜你喜欢
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多