우리는 우리의 방법 중 일부를 최적화하려고합니다. Redgate의 성능 프로파일 러를 사용하여 성능 누출을 찾습니다.개체 - FirstOrDefault 성능에 C# Linq
Google 도구는 여러 방법으로 개체에 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' ==은'boeking을 이동하는 것입니다, 그리고 루프 _outside_은'SaldoGebouwRekeningVerdeling.SaldoGebouwRekening.SaldoVerdeelsleutel.GebouwVerdeelSleutel.ID' 값입니다. 컬렉션의 모든 요소에 대해 다시 평가할 필요는 없습니다. –
식에서 읽으면 쿼리가 실행됩니다. 이 경우 FirstOrDefault는 전체 식 트리를 실행하므로 느린 FirstOrDefault는 아닙니다. –
필수적인주의 사항 : 비어있는'catch {}'는 매우 해로울 수 있습니다. –