2017-12-02 68 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端完成,包括消除重复的。

相关问题