我真的不确定这是不是一个合适的问题,但我想我会试一试,看看会出现什么样的答案。
在我们的开发阶段,我们正在进行用户接受度测试,用户发现其中一件事有点欠缺,那就是在选择搜索结果后加载标签的速度。我已经实现了日志方法,并提出了一些方法和数据检索/操作的罪魁祸首,这些方法和数据检索/操作导致了感知到的缓慢。下面是最大的问题。该方法的目的是选择保单或任何子保单收到的所有付款,根据到期日和支付日期将它们分组在一起,然后返回一个GroupedClass,该all将对整个保单支付的金额进行合计。我想知道有没有什么方法可以让这件事变得更有效率。我注意到,在使用这些旧的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);发布于 2012-09-18 16:16:34
我注意到,在使用这些旧的UniVerse数据时,如果它们在被利用之前不强制转换为
.AsEnumerable(),就会崩溃
这就是你问题的根源。通过说AsEnumerable,您在排序和获取前三条记录之前,强制将该点序列中的所有记录都取下。显然,对于更多的数据,这将变得越来越慢。
考虑到您所说的,修复这个问题可能很困难。一般来说,LINQ提供者提供了不同数量的功能,根据哪些功能可以在服务器上进行评估,哪些功能不能在服务器上进行评估。从上面的评论来看,LINQ-to-UniVerse似乎在服务器上做事情时做得并不是特别好。
例如,我希望任何好的数据库LINQ提供程序都能做到(使用虚构的定义)
context.Products.Where(p => p.Type == 4).OrderBy(p => p.Name)但是,上面的代码更加繁琐。尝试将其拆分成更小的部分,并确定是否可以让服务器执行排序和Take(3)。最好的做法可能是执行一次查询(这可以在服务器上完成)来获取底部的三个PAYDUE_值,然后再执行另一次查询来实际获取这些日期的金额,将所有相关记录拉到客户端。
发布于 2012-09-18 00:49:23
假设您运行的是SQL Server,我会启用性能分析,Linq有一个习惯,它不会生成您想要的SQL。速度减慢更有可能是由糟糕的SQL造成的,而不是内存操作造成的。
https://stackoverflow.com/questions/12463239
复制相似问题