Tengo una función que utiliza Linq para obtener datos de la base de datos y luego llamo a esa función en otra función para sumar todas las propiedades individuales usando .Sum en cada propiedad individual. Me preguntaba si existe una forma eficiente de sumar todas las propiedades a la vez en lugar de llamar a .Sum() en cada propiedad individual. Creo que la forma en que estoy haciendo a partir de ahora, es muy lenta (aunque no probada).Manera eficiente de llamar .Sum() en propiedades múltiples
public OminitureStats GetAvgOmnitureData(int? fnsId, int dateRange)
{
IQueryable<OminitureStats> query = GetOmnitureDataAsQueryable(fnsId, dateRange);
int pageViews = query.Sum(q => q.PageViews);
int monthlyUniqueVisitors = query.Sum(q => q.MonthlyUniqueVisitors);
int visits = query.Sum(q => q.Visits);
double pagesPerVisit = (double)query.Sum(q => q.PagesPerVisit);
double bounceRate = (double)query.Sum(q => q.BounceRate);
return new OminitureStats(pageViews, monthlyUniqueVisitors, visits, bounceRate, pagesPerVisit);
}
Editar
private IQueryable<OminitureStats> GetOmnitureDataAsQueryable(int? fnsId, int dateRange)
{
var yesterday = DateTime.Today.AddDays(-1);
var nDays = yesterday.AddDays(-dateRange);
if (fnsId.HasValue)
{
IQueryable<OminitureStats> query = from o in lhDB.omniture_stats
where o.fns_id == fnsId
&& o.date <= yesterday
&& o.date > nDays
select new OminitureStats (
o.page_views.GetValueOrDefault(),
o.monthly_unique.GetValueOrDefault(),
o.visits.GetValueOrDefault(),
(double)o.bounce_rate.GetValueOrDefault()
);
return query;
}
return null;
}
Editar:
public class OminitureStats
{
public OminitureStats(int PageViews, int MonthlyUniqueVisitors, int Visits, double BounceRate)
{
this.PageViews = PageViews;
this.MonthlyUniqueVisitors = MonthlyUniqueVisitors;
this.Visits = Visits;
this.BounceRate = BounceRate;
this.PagesPerVisit = Math.Round((double)(PageViews/Visits), 1);
}
public OminitureStats(int PageViews, int MonthlyUniqueVisitors, int Visits, double BounceRate, double PagesPerVisit)
{
this.PageViews = PageViews;
this.MonthlyUniqueVisitors = MonthlyUniqueVisitors;
this.Visits = Visits;
this.BounceRate = BounceRate;
this.PagesPerVisit = PagesPerVisit;
}
public int PageViews { get; set; }
public int MonthlyUniqueVisitors { get; set; }
public int Visits { get; set; }
public double PagesPerVisit { get; set; }
public double BounceRate { get; set; }
}
Thanks Jon. Pero estoy obteniendo 'NotSupportedException' en' var sums ... '. pero no tiene nada que ver con tu solución. Porque probé de la forma en que lo estaba haciendo y aún arrojaría esta excepción. ¿Tiene algo que ver con la parte 'IQueryable'? –
SherCoder
Y también, ¿en qué se diferencia su solución de la forma en que lo estoy haciendo? Todavía tengo que llamar a .Sum() en cada propiedad individual. Gracias – SherCoder
@SherCoder: en cuanto a la excepción, tendrás que decirnos exactamente con qué tipo de 'IQueryable' estás trabajando. En cuanto a cómo esto es mejor: todas las sumas se expresan como parte del mismo árbol de expresión, por lo que la capa de traducción SQL puede extraerlas en una sola consulta. – Jon