gpt4 book ai didi

c# - 使用 IDbConnection.Query() 返回 IEnumerable 时,AsList() 是否比 ToList() 更好?

转载 作者:行者123 更新时间:2023-12-01 22:09:57 26 4
gpt4 key购买 nike

我读到了 Marc Gravell (@MarcGravell) 的回答:https://stackoverflow.com/a/47790712/5779732

最后一行说:

As a minor optimization to your code: prefer AsList() to ToList() to avoid creating a copy.

该声明是关于 QueryMultiple()返回 GridReader .

据我了解,System.Linq提供扩展方法IEnumerable.ToList() 。以下来自Microsoft关于ToList() .

The ToList(IEnumerable) method forces immediate query evaluation and returns a List that contains the query results. You can append this method to your query in order to obtain a cached copy of the query results.

IDbConnection.Query()永远会回来 IEnumerablenull 。空检查可以在调用代码中轻松完成。 AsList 有什么区别那么呢?

如果我的理解是正确的,AsList将始终在内部调用ToList这将创建一个副本。

考虑到这一点,是AsList()ToList() 更好与 IDbConnection.Query()返回 IEnumerable ?如果是;为什么?

那是什么AsList()在这种情况下,在内部这是否使它成为更好的选择?

最佳答案

AsList是一个自定义的 Dapper 扩展方法。它所做的只是检查 IEnumerable<T> 是否你传给它的确实是List<T> 。如果是 - 它将返回它,只是转换为 List<T> 。如果不是 - 它会调用常规 ToList 。重点是-ToList()总是创建一个副本,即使您传递给它的已经是一个列表。 AsList()方法避免进行此复制,因此在不需要此类复制时很有用。

在此特定场景中,您有以下代码:

multipleresult.Read<MerchantProduct>()

哪里multipleresultGridReaderReadbuffered默认情况下为 true 的参数。当它是真的时 - Read真的会回来List<T> ,所以通过调用 ToList您将毫无理由地再次复制该列表。

IDbConnection.Query() 也是如此。 - 也是有buffered参数,默认为 true,因此也会默认返回 List<T> .

如果您更喜欢使用ToList() - 您可以通过buffered: falseQuery()Read()以避免创建额外的副本。

关于c# - 使用 IDbConnection.Query() 返回 IEnumerable 时,AsList() 是否比 ToList() 更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47794373/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com