[英]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
方法的时间。
.ToList()
? 删除第一个,这会有所帮助。 .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.