【发布时间】:2013-09-03 05:35:02
【问题描述】:
我们正在尝试优化我们的一些方法。我们使用 Redgate 的性能分析器来查找一些性能漏洞。
我们的工具以多种方法使用 Linq 对象。但我们注意到 FirstOrDefault 处理包含 +/- 1000 个对象的集合需要很长时间。
分析器还会提醒查询非常慢。我已经添加了带有分析器结果的图像。
无法将集合添加到数据库然后查询数据库。 有什么建议吗?
谢谢!
private SaldoPrivatiefKlantVerdeelsleutel GetParentSaldoPrivatiefKlantVerdeelsleutel(SaldoPrivatiefKlantVerdeelsleutel saldoPrivatiefKlantVerdeelsleutel, SaldoGebouwRekeningBoeking boeking, int privatiefKlant)
{
SaldoPrivatiefKlantVerdeelsleutel parentSaldoPrivatiefKlantVerdeelsleutel = null;
if (saldoPrivatiefKlantVerdeelsleutel != null)
{
try
{
parentSaldoPrivatiefKlantVerdeelsleutel = saldoPrivatiefKlantVerdeelsleutel.AfrekenPeriode.SaldoPrivatiefKlantVerdeelsleutelCollection
.FirstOrDefault(s => (boeking == null || (s.SaldoVerdeelsleutel != null &&
(s.SaldoVerdeelsleutel.GebouwVerdeelSleutel.ID == boeking.SaldoGebouwRekeningVerdeling.SaldoGebouwRekening.SaldoVerdeelsleutel.GebouwVerdeelSleutel.ID)))
&& s.PrivatiefKlant.ID == privatiefKlant);
}
catch (Exception ex)
{ }
}
return parentSaldoPrivatiefKlantVerdeelsleutel;
}
图片: Profile report
【问题讨论】:
-
我的第一个想法是将
boeking == null检查和SaldoGebouwRekeningVerdeling.SaldoGebouwRekening.SaldoVerdeelsleutel.GebouwVerdeelSleutel.ID值移出您的循环。没有理由为您收藏中的每个元素重新评估它。 -
从表达式中读取时执行查询。在这种情况下,FirstOrDefault 将执行整个表达式树,所以不是 FirstOrDefault 慢。
-
必填项:空
catch{}非常有害,删除它。 -
现在我要问你一个问题...对象是通过 NHibernate 或实体框架加载的,对吗?你确定它们没有部分延迟加载吗?喜欢这个
s.SaldoVerdeelsleutel.GebouwVerdeelSleutel.ID吗?因为它可能是经典的SELECT N+1 antipattern。
标签: c# performance linq