我們正在嘗試優化我們的一些方法。我們使用Redgate的性能分析器來查找一些性能泄漏。c#Linq to Objects - FirstOrDefault performance
我們的工具在幾種方法中使用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
我首先想到的是移動'的預訂== null'檢查和'SaldoGebouwRekeningVerdeling.SaldoGebouwRekening.SaldoVerdeelsleutel.GebouwVerdeelSleutel.ID'值_outside_你的循環。沒有理由爲您的收藏中的每個元素重新評估它。 –
從表達式讀取時執行查詢。在這種情況下,FirstOrDefault將執行整個表達式樹,所以它不是FirstOrDefault,它很慢。 –
必填註釋:一個空的'catch {}'是非常有害的,請將其刪除。 –