2010-07-06 2 views
0

를 사용하여 설정 나는 다음과 같은 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

간단한 확장 방법을 만들었습니다. 그리고 간단한 스톱워치 벤치 마크에서 2 배 더 효율적이라고 판명되었습니다.

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