找到linq中的“最有进步”

时间:2009-05-15 06:18:57

标签: linq-to-sql

以下代码是我用来识别前十名收入项目的代码

var top = (from m in db.Stats
           where m.Item.AccountID == AccountID
           && m.DateTime >= month
           && m.DateTime < month.AddMonths(1)
           group m by m.Item into g
           orderby g.Sum(p => p.Earnings) descending
           select g.Key).Take(10).ToArray();

在比较2个不同月份时,我需要确定哪个项目的改进率最高(%)。可用数据仅为每日总计。我可能需要过滤掉低于一定数量“访客”的项目,即

m.Visitors >= 20

在Linq-Sql中执行此操作的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

如果将查询拆分为两个不同的组,即当前月份(或时间段)和上个月(或时间段),则应该更容易管理。为清楚起见,我使用私有类来保持我们感兴趣的结果。您可以使用现有的类来代替。或者,编译器甚至可能足够聪明地意识到属性是相同的,因此为两个查询生成相同的匿名类。无论如何......

private class C {
    public object Key { get; set; }

    public object Earnings { get; set; }
}

var thisMonth = (from m in db.Stats
                 where m.Item.AccountID == AccountID
                 && m.DateTime.Month == month
                 group m by m.Item into g
                 select new C { g.Key, g.Earnings });

var lastMonth = (from m in db.Stats
                 where m.Item.AccountID == AccountID
                 && m.DateTime.Month == month.AddMonths(-1)
                 group m by m.Item into g
                 select new C { g.Key, g.Earnings });

从这里开始,需要将结果组合起来计算两组之间的增益或损失百分比。一旦完成,你可以按最高收益排序,以获得你的前n。