[英]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.