使用linq在聚合结果集上聚合函数

时间:2010-07-06 13:04:53

标签: linq

我有以下linq查询:

var totalAmountsPerMonth =               
                from s in Reports()
                where s.ReportDate.Value.Year == year
                group s by s. ReportDate.Value.Month into g
                orderby g.Key
                select new
                {
                   month  = g.Key,
                   totalRecaudacion = g.Sum(rec => rec.RECAUDACION),
                   totalServicios = g.Sum(ser => ser.SERVICIOS)
                };

var final = new ResultSet
            {
               Recaudacion = meses.Average(q => q. totalRecaudacion),
               Servicios = meses.Average(o => o. totalServicios)
            };

我需要获得每月“RECAUDACION”和“SERVICIOS”总量的平均值。我做了这个查询。但是,我绝对认为这不是最好的解决方案。您能否建议我使用更好,更有效的方法(如果可能,在单个查询中)获取这些数据?

1 个答案:

答案 0 :(得分:1)

我创建了一个简单的扩展方法。事实证明,在简单的秒表基准测试中效率提高了两倍。

public class Report
{
    public DateTime? Date { get; set; }

    public int RECAUDACION { get; set; }

    public int SERVICIOS { get; set; }
}

static class EnumerableEx
{
    public static Tuple<double, double> AveragePerMonth(this IEnumerable<Report> reports)
    {
        var months = new HashSet<int>();
        double RECAUDACION = 0d;
        double SERVICIOS = 0d;

        foreach (Report rep in reports)
        {
            if (!months.Contains(rep.Date.Value.Month))
            {
                months.Add(rep.Date.Value.Month);
            }

            RECAUDACION += rep.RECAUDACION;
            SERVICIOS += rep.SERVICIOS;
        }

        var totalMonth = months.Count;

        if (months.Count > 0)
        {
            RECAUDACION /= totalMonth;
            SERVICIOS /= totalMonth;
        }

        return Tuple.Create<double, double>(RECAUDACION, SERVICIOS);
    }
}