繁体   English   中英

LINQ选择里面有很多ToList花费太多时间

[英]LINQ select with many ToList inside takes too much time

我在下面使用LINQ查询进行select ,如果我在Select on AsQueryable执行ToList ,则会花费太多时间。

方法1

大约需要10秒

这是使用不同的ToList()来最简单地表示我的数据

MYTABLE以下与COLUMN (另一个表)具有一对多关系,其中COLUMN具有Description字段

使用探查器查询对所有ToList都具有UNION ALL,但查询本身在100毫秒内执行,似乎需要C#进行解析

  // Project into usable data and enumerate
            var enumerated = await this.Context.MYTABLE.AsQueryable().Where(some condition).Select(x => new
            {
                Study1 = x.COLUMN.Select(j => j.Description1).ToList(),
                Study2 = x.COLUMN.Select(j => j.Description2).ToList(),
                Study3 = x.COLUMN.Select(j => j.Description3).ToList(),
                Study4 = x.COLUMN.Select(j => j.Description4).ToList(),
                Study5 = x.COLUMN.Select(j => j.Description5).ToList()
            }).ToListAsync(cancellationToken);

            var results = enumerated.Select(o => new
            {
                Result1 = string.Join(", ", o.Study1),
                Result2 = string.Join(", ", o.Study2),
                Result3 = string.Join(", ", o.Study3),
                Result4 = string.Join(", ", o.Study4),
                Result5 = string.Join(", ", o.Study5),
            }).ToList();

            return results;

方法2

大约需要2秒

与以前的相比,使用探查器查询的规模很小,大约为1/5行

// Project into usable data and enumerate
        var enumerated = await this.Context.MYTABLE.AsQueryable().Where(some condition).Select(x => new
        {
            x.COLUMN
        }).ToListAsync(cancellationToken);

        var results = enumerated.Select(o => new
        {
            Result1 = string.Join(", ", o.COLUMN.Select(j => j.Description1).ToList()),
            Result2 = string.Join(", ", o.COLUMN.Select(j => j.Description2).ToList()),
            Result3 = string.Join(", ", o.COLUMN.Select(j => j.Description3).ToList()),
            Result4 = string.Join(", ", o.COLUMN.Select(j => j.Description4).ToList()),
            Result5 = string.Join(", ", o.COLUMN.Select(j => j.Description5).ToList()),
        }).ToList();

        return results;

为什么Approch 2需要更少的时间,而查询也比1更简单?

有什么建议可以提高LINQ性能

编辑

我注意到在方法2中 ,它将为后续的ToList()多次调用database ,但是仍然进行所有这些计算, Database在几毫秒内检索到,而C#需要更多时间。

方法3

这也需要2s左右的时间。

我只是在方法1中首先进行了ToList

 // Project into usable data and enumerate
  var enumerated2 =  await this.Context.MYTABLE.AsQueryable().Where(some condition).ToListAsync(cancellationToken);

            var enumerated = enumerated2.Select(x => new
            {
                Study1 = x.COLUMN.Select(j => j.Description1).ToList(),
                Study2 = x.COLUMN.Select(j => j.Description2).ToList(),
                Study3 = x.COLUMN.Select(j => j.Description3).ToList(),
                Study4 = x.COLUMN.Select(j => j.Description4).ToList(),
                Study5 = x.COLUMN.Select(j => j.Description5).ToList()
            }).ToList()

            var results = enumerated.Select(o => new
            {
                Result1 = string.Join(", ", o.Study1),
                Result2 = string.Join(", ", o.Study2),
                Result3 = string.Join(", ", o.Study3),
                Result4 = string.Join(", ", o.Study4),
                Result5 = string.Join(", ", o.Study5),
            }).ToList();

            return results;

我不明白为什么Approch 3花费的时间少于Approch 1所执行的ToList方法的时间。

  1. 为什么需要两次调用.ToList() 删除第一个,这会有所帮助。
  2. 尝试使用.Include("Tablename") 您可以在这里阅读有关内容: https : //medium.com/@lucavgobbi/improving-performance-with-linq-b478cd77d105

这可能是您面临的所谓“ n + 1问题”。 您可以在这里阅读有关内容: https : //www.brentozar.com/archive/2018/07/common-entity-framework-problems-n-1/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM