首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >代码效率/优化

代码效率/优化
EN

Stack Overflow用户
提问于 2012-09-18 00:15:26
回答 2查看 139关注 0票数 1

我真的不确定这是不是一个合适的问题,但我想我会试一试,看看会出现什么样的答案。

在我们的开发阶段,我们正在进行用户接受度测试,用户发现其中一件事有点欠缺,那就是在选择搜索结果后加载标签的速度。我已经实现了日志方法,并提出了一些方法和数据检索/操作的罪魁祸首,这些方法和数据检索/操作导致了感知到的缓慢。下面是最大的问题。该方法的目的是选择保单或任何子保单收到的所有付款,根据到期日和支付日期将它们分组在一起,然后返回一个GroupedClass,该all将对整个保单支付的金额进行合计。我想知道有没有什么方法可以让这件事变得更有效率。我注意到,在使用这些旧的UniVerse数据时,如果它们在被利用之前不强制转换为.AsEnumerable(),那么它们往往会崩溃:

代码语言:javascript
复制
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);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-18 16:16:34

我注意到,在使用这些旧的UniVerse数据时,如果它们在被利用之前不强制转换为.AsEnumerable(),就会崩溃

这就是你问题的根源。通过说AsEnumerable,您在排序和获取前三条记录之前,强制将该点序列中的所有记录都取下。显然,对于更多的数据,这将变得越来越慢。

考虑到您所说的,修复这个问题可能很困难。一般来说,LINQ提供者提供了不同数量的功能,根据哪些功能可以在服务器上进行评估,哪些功能不能在服务器上进行评估。从上面的评论来看,LINQ-to-UniVerse似乎在服务器上做事情时做得并不是特别好。

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

代码语言:javascript
复制
context.Products.Where(p => p.Type == 4).OrderBy(p => p.Name)

但是,上面的代码更加繁琐。尝试将其拆分成更小的部分,并确定是否可以让服务器执行排序和Take(3)。最好的做法可能是执行一次查询(这可以在服务器上完成)来获取底部的三个PAYDUE_值,然后再执行另一次查询来实际获取这些日期的金额,将所有相关记录拉到客户端。

票数 2
EN

Stack Overflow用户

发布于 2012-09-18 00:49:23

假设您运行的是SQL Server,我会启用性能分析,Linq有一个习惯,它不会生成您想要的SQL。速度减慢更有可能是由糟糕的SQL造成的,而不是内存操作造成的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12463239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档