У меня есть функция, которая использует Linq для получения данных из базы данных, а затем я вызываю эту функцию в другой функции, чтобы суммировать все отдельные свойства, используя .Sum для каждого отдельного свойства. Мне было интересно, есть ли эффективный способ суммировать все свойства сразу, а не вызывать .Sum() для каждого отдельного свойства. Я думаю, что способ, которым я занимаюсь сейчас, очень медленный (хотя и непроверенный).Эффективный способ вызова .Sum() для нескольких свойств
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);
}
Редактировать
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;
}
Edit:
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. Но я получаю 'NotSupportedException' в' var sums ...'. но это не имеет никакого отношения к вашему решению. Потому что я проверял, как я это делал, и все равно это исключение. Это имеет какое-либо отношение к 'IQueryable' part? –
SherCoder
А также как ваше решение отличается от того, как я это делаю. Мне еще нужно вызвать .Sum() для каждого отдельного свойства. Спасибо – SherCoder
@SherCoder: Что касается исключения, вам нужно сказать нам, с какими именно «IQueryable» вы работаете. Что касается того, как это лучше: все суммы выражаются как часть одного и того же дерева выражений, поэтому уровень перевода SQL может вывести их только в одном запросе. – Jon