【发布时间】:2018-05-27 10:08:30
【问题描述】:
我从 Marc Gravell (@MarcGravell) 那里读到了这个答案:https://stackoverflow.com/a/47790712/5779732
最后一行说:
作为对代码的小优化:更喜欢 AsList() 而不是 ToList() 以避免创建副本。
该语句是关于 QueryMultiple() 的,它返回 GridReader。
据我了解,System.Linq提供了一个扩展方法IEnumerable.ToList()。以下来自Microsoft 关于ToList()。
ToList(IEnumerable) 方法强制立即进行查询评估并返回一个包含查询结果的列表。您可以将此方法附加到查询中,以获取查询结果的缓存副本。
IDbConnection.Query() 将始终返回 IEnumerable 或 null。在调用代码时可以很容易地进行空检查。那么AsList 有什么不同呢?
如果我的理解是正确的,AsList 将始终在内部调用ToList,这将创建一个副本。
考虑到这一点,AsList() 是否比 ToList() 更好,IDbConnection.Query() 返回 IEnumerable?如是;为什么?
AsList() 在内部做了什么使其在这种情况下成为更好的选择?
【问题讨论】:
-
查看the source,你会看到cmets表明如果数据已经在
List数据结构中,那么将返回那个列表(即实例),而不是创建一个新的(即复制)List. -
@KennethK.:同意。但是
IDbConnection.Query()总是会返回IEnumerable或null。在调用代码中可以轻松完成空值检查。那么AsList有什么不同呢?
标签: c# performance linq dapper database-performance