c# Linq to Objects - FirstOrDefault 性能

标签 c# performance linq

我们正在努力优化我们的一些方法。我们使用 Redgate 的性能分析器来查找一些性能漏洞。

我们的工具使用 Linq to objects 的多种方法。但是我们注意到 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

最佳答案

您应该可以通过将其重写为来加快速度

saldoPrivatiefKlantVerdeelsleutel.AfrekenPeriode.SaldoPrivatiefKlantVerdeelsleutelCollection
            .Where(s => (boeking == null || (s.SaldoVerdeelsleutel != null &&
                (s.SaldoVerdeelsleutel.GebouwVerdeelSleutel.ID == boeking.SaldoGebouwRekeningVerdeling.SaldoGebouwRekening.SaldoVerdeelsleutel.GebouwVerdeelSleutel.ID))) && s.PrivatiefKlant.ID == privatiefKlant)
            .FirstOrDefault()

参见 Why is LINQ .Where(predicate).First() faster than .First(predicate)?为什么这样更快。

关于c# Linq to Objects - FirstOrDefault 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18533744/

相关文章:

c# - 您可以使用 MVVM 模式将多个 LineSeries 绑定(bind)到 WPF 中的 oxyplot 吗?

performance - 子集和的变体

performance - template 和 templateUrl Angularjs 之间的性能差异有多大

c# - 使用 LINQ 按位置组合两个列表中的条目

c# - 内联组合数组 - LINQ

c# - NancyFX 有不同的托管选项?

c# - AutoFac Controller 没有默认构造函数

c# - 实时观察 WPF 中写入的 CSV

ruby-on-rails - 如何查明是什么减慢了我的 Rails 应用程序

c# - 如何使用 LINQ to XML 从示例 XML 中获取值