1

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

我们正处于开发阶段,我们正在进行用户验收测试,用户发现有点缺乏的一件事是在选择搜索结果后加载选项卡的速度。我已经实现了日志记录方法,并提出了一些导致感知缓慢的方法和数据检索/操作的罪魁祸首。下面是最大的问题。该方法的目的是选择为保单或任何子保单收到的所有付款,按到期日和付款日期将它们组合在一起,然后返回一个 GroupedClass,它将为整个保单支付的金额相加。我想知道是否有任何方法可以提高效率。我注意到使用这些旧的 UniVerse 数据,如果不强制转换,事情往往会中断。

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);
4

2 回答 2

2

我注意到在使用这些旧的 UniVerse 数据时,如果.AsEnumerable()在使用之前不进行转换,事情往往会崩溃

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

鉴于您所说的,解决此问题可能很困难。一般来说,LINQ 提供程序提供了不同数量的功能,这些功能可以在服务器上评估,哪些不能。从您上面的评论来看,听起来 LINQ-to-UniVerse 在服务器上做事并不是特别好。

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

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

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

于 2012-09-18T08:16:34.010 回答
0

假设您正在针对 SQL Server 运行,我将启用分析,Linq 习惯于不生成您想要的 SQL。与内存操作相比,速度变慢更有可能是由于 SQL 错误造成的。

于 2012-09-17T16:49:22.777 回答