代码效率/优化

时间:2012-09-17 16:15:26

标签: c# linq

不确定这是否是一个正确的问题,但我认为我会试一试,看看会弹出什么样的答案。

我们正处于开发阶段,我们正在进行用户验收测试,用户发现有一点缺点的事情是选择搜索结果后加载选项卡的速度。我已经实现了日志记录方法,并且已经提出了一些关于导致感知缓慢的方法和数据检索/操作的罪魁祸首。以下是最大的问题。该方法的目的是选择针对策略或任何子策略收到的所有付款,在到期日和付款日期将它们组合在一起,然后返回GroupedClass,该GroupedClass将对整个策略支付的金额相加。我想知道是否有任何方法可以提高效率。我注意到使用这个旧的UniVerse数据,如果它们没有被投射,事情往往会破坏.AsEnumerable()在被利用之前:

var mc = new ModelContext();
var policy = mc.Polmasts.Find("N345348");
        var payments =
            mc.Paymnts.Where(p => p.POLICY.Contains(policy.ID)).GroupBy(p => new { p.PAYDUE_, p.PAYPD_ }).Select(
                    grp =>
                    new GroupedPayments
                        {
                            PAYPD_ = grp.Key.PAYPD_,
                            PAYDUE_ = grp.Key.PAYDUE_,
                            AMOUNT = grp.Sum(a => a.AMOUNT),
                            SUSP = grp.Sum(a => a.SUSP)
                        }).AsEnumerable().OrderByDescending(g => g.PAYDUE_).Take(3);

2 个答案:

答案 0 :(得分:2)

  

我注意到使用这些旧的UniVerse数据,如果在使用之前没有投放.AsEnumerable(),事情往往会中断

这是你问题的根源。通过说AsEnumerable,您强制所有记录在此时序列中被删除,之前排序并取前三个。显然,对于更多数据,这将变得越来越慢。

考虑到你的说法,解决这个问题可能很困难。通常,LINQ提供程序在服务器上可以评估的内容和不可能的内容方面提供不同数量的功能。从上面的评论来看,听起来LINQ-to-UniVerse在服务器上做的事情并不是特别好。

例如,我希望任何好的数据库LINQ提供程序都可以(使用虚构的定义)

context.Products.Where(p => p.Type == 4).OrderBy(p => p.Name)

在服务器上;但是,上面的代码更加费力。尝试将其拆分为较小的部分并确定是否可以让服务器进行排序并Take(3)。可能最好的办法是一个查询(可以在服务器上完成)以获得最低的三个PAYDUE_值,然后另一个查询实际获得那些值日期,将所有相关记录下载到客户端。

答案 1 :(得分:0)

假设你正在运行SQL Server,我会启用分析,Linq习惯于不生成你想要的SQL。这种减速更可能来自错误的SQL,而不是来自内存操作。