c# - 在多个属性上调用 .Sum() 的有效方法

标签 c# linq iqueryable

我有一个使用 Linq 从数据库中获取数据的函数,然后我在另一个函数中调用该函数以对每个单独的属性使用 .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;
    }

编辑:

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

最佳答案

IIRC 你可以用

一次完成所有的总和(只要查询被翻译成SQL)
var sums = query.GroupBy(q => 1)
                .Select(g => new
                {
                    PageViews = g.Sum(q => q.PageViews),
                    Visits = g.Sum(q => q.Visits),
                    // etc etc
                })
                .Single();

这将为您提供一个对象,其中包含作为单独属性的所有总和。

关于c# - 在多个属性上调用 .Sum() 的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11335418/

相关文章:

c# - IQueryable 扩展方法成为表达式

c# - 返回 IQueryable<T> 或不返回 IQueryable<T>

c# - 列表查询比 IQueryable 快 20 倍?

c# - Entity framework Profile Provider example..如何初始化和设置请帮忙!

c# - 通过 WCF 抛出异常的正确方法

c# - LINQ : Sequence contains no elements 错误

LINQ 和 CASE 敏感性

c# - 使用 IronPython 简化为 C# 应用程序编写的 DSL

c# - 如何确定 Expression<Func<T, object>> 是否对 EntityFramework .Include 有效

c# - Find() 与 FirstOrDefault() 的性能对比