C#中的LINQ到对象 - FirstOrDefault性能 [英] c# Linq to Objects - FirstOrDefault performance

查看:1491
本文介绍了C#中的LINQ到对象 - FirstOrDefault性能的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们正在努力优化我们的一些方法。我们使用展鹏的性能分析器找到一些性能泄漏。

We're trying to optimize some of our methods. We use Redgate's Performance profiler to find some performance leaks.

我们的工具使用LINQ to对象的几种方法。但是,我们注意到,一个 FirstOrDefault 花费很长的与+/- 1000个对象的集合。

Our tool uses Linq to objects in several methods. But we have noticed that a FirstOrDefault takes very long on collections with +/- 1000 objects.

探查还提醒该查询是很慢的。我的探查结果添加的图像。

The profiler also alerts that the query is very slow. I've added images with the profiler results.

这是不可能的集合添加到一个数据库,然后查询数据库。
任何建议?

It's not possible to add the collection to a database and then query the database. Any recommendations?

谢谢!

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报告

推荐答案

您应该可以通过改写为

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()

请参阅的为什么LINQ。凡(谓语)。首先()比快。首先(谓语) ?为什么这是更快的。

See Why is LINQ .Where(predicate).First() faster than .First(predicate)? for why this is faster.

这篇关于C#中的LINQ到对象 - FirstOrDefault性能的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆