2017-12-02 69 views
-1

我有這段代碼,但我不確定以下兩個選項中的哪一個會更有效率。誰能讓我知道哪個更有效率,爲什麼?DistinctBy()。Select()或Select()。DistinctBy()是更高效嗎? C#

var list1 = await context.Data.Where(i => i.Market == "nasdaq").DistinctBy(i => i.Symbol).Select(i => i.Symbol).ToListAsync(); 

var list2 = await context.Data.Where(i => i.Market == "nasdaq").Select(i => i.Symbol).DistinctBy(i => i).ToListAsync(); 

注:我用的是MoreLinq圖書館

+1

@dasblinkenlight對不起,我忘了指定我使用MoreLinq庫 – user3610374

+2

'DistinctBy'和MoreLinq與EF沒有任何共同之處,因爲它們在'IEnumerable '上操作。最有效的方法是使用'Select' +'Distinct'(否'By')將被轉換爲SQL並在數據庫中執行。 –

+0

我不認爲兩者之間有太大的區別,因爲兩個DistinctBy調用使用謂詞,因此在數據列表或直接使用符號列表上使用它幾乎是相同的。如果你仍然好奇哪一種效率更高,那麼做一個簡單的基準並親自體驗一下,但老實說,我不會「浪費」這些小的「優化」時間, – Haytam

回答

8

由於MoreLinq庫不上IQueryable<T>提供DistinctBy,只有IEnumerable<T>,第一個查詢後,在內存中完成Where部分。因此,整個對象被轉移,這是不理想的。

第二個查詢只需要Symbol,所以它稍好些。但是,重複的符號仍然會傳輸到內存中,因此有優化的空間。

您可以通過觀察DistinctBy(i => i)改進它是一樣的Distinct()

var list2 = await context.Data 
    .Where(i => i.Market == "nasdaq") 
    .Select(i => i.Symbol) 
    .Distinct() 
    .ToListAsync(); 

現在一切都在RDBMS端完成,包括消除重複的。

相關問題