簡體   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