- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我读到了 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()
永远会回来 IEnumerable
或null
。空检查可以在调用代码中轻松完成。 AsList
有什么区别那么呢?
如果我的理解是正确的,AsList
将始终在内部调用ToList
这将创建一个副本。
考虑到这一点,是AsList()
比 ToList()
更好与 IDbConnection.Query()
返回 IEnumerable
?如果是;为什么?
那是什么AsList()
在这种情况下,在内部这是否使它成为更好的选择?
最佳答案
AsList
是一个自定义的 Dapper 扩展方法。它所做的只是检查 IEnumerable<T>
是否你传给它的确实是List<T>
。如果是 - 它将返回它,只是转换为 List<T>
。如果不是 - 它会调用常规 ToList
。重点是-ToList()
总是创建一个副本,即使您传递给它的已经是一个列表。 AsList()
方法避免进行此复制,因此在不需要此类复制时很有用。
在此特定场景中,您有以下代码:
multipleresult.Read<MerchantProduct>()
哪里multipleresult
是 GridReader
。 Read
有buffered
默认情况下为 true 的参数。当它是真的时 - Read
真的会回来List<T>
,所以通过调用 ToList
您将毫无理由地再次复制该列表。
IDbConnection.Query()
也是如此。 - 也是有buffered
参数,默认为 true,因此也会默认返回 List<T>
.
如果您更喜欢使用ToList()
- 您可以通过buffered: false
至Query()
或Read()
以避免创建额外的副本。
关于c# - 使用 IDbConnection.Query() 返回 IEnumerable 时,AsList() 是否比 ToList() 更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47794373/
在 MVC 项目中,我有一个带有命令和查询的服务层。 在其中一些命令和查询中,我使用了需要连接的 Dapper。 public class GetPostsStatsQuery { public
我应该如何将 IDbConnection 和 IDbTransaction 与 Dapper 一起使用? 目前我只使用 IDbConnection 。如下: using (SqlConnection
当我编写应用程序时,我使用 System.Data 接口(interface)(IDbConnection、IDbCommand、IDataReader、IDbDataParameter 等...)。
我想用 firebird db 测试 dapper micro orm,但我很难访问 firebird。 Firebird 服务器已启动并运行,数据库中填充了一些虚拟数据,并存储在 c:\mydata
我有时会引发此异常: System.InvalidOperationException: 'The ConnectionString property has not been initialized
我有一个使用 autofac 进行依赖注入(inject)的 .NET MVC 应用程序。当应用程序启动时,以下代码注册 IDbConnection var connectionString = C
当连接到 SQL-Server 时,我的程序执行挂起在 .Open() 方法上超过指定的 2 秒超时。 当数据库所在的机器离线或重新启动时,我设法重现了这个问题。当数据库所在的机器启动时,程序的执行将
我有一些按顺序调用的方法,它们都按顺序对 MySQL 数据库执行查询: UpdateInvoice() - > UpdateOrderItems(connection) |--------
我有一个 IDbConnection 的实例,它可以是任何连接、Sql、OleDb 等。我想制作一个通用包装器,这样我就可以向包装器发送一个连接并获得一组很好的方法以便于操作。我有一个 Query 方
虽然我的假设听起来很主观,但经过一些研究后,我发现开发人员喜欢使用虚拟 Try/Catch 而不是使用 Using statement 的情况并不少见。用于 IDbConnection/IDbTran
我知道将 IDbConnection 对象包装在 using block 中可确保调用 Dispose 并释放它正在使用的资源。话虽如此,我是否还需要将 IDbCommand 和 IDataReade
我在我的 ASP.NET WebForms 解决方案中使用了 dapper。 我所有处理数据的类都从这个基类中检索一个打开的连接 public abstract class SalesDb : IDi
我需要一些帮助 我尝试将 INSERT 插入到我的 SQL 数据库中,但我做不到,因为在此代码行中给我一个错误: commandoSQL.Connection = dbcon; 我收到这个错误: A
TLDR:注入(inject)连接工厂与 IDbConnection 本身的原因是什么。 我目前在 .net MVC 中使用 Autofac 将 IDbConnection 实例注入(inject)到
Entity Framework cotext DbContext 具有采用 DbConnection 的构造函数。为什么不是 IDbConnection? 是否通常将 DbConnection 传递
我有一个 .Net 核心 Web 应用程序和 .net 核心库。在使用 Dapper 时,我需要传入一个继承自 IDbConnection 的具体类。问题是在 .Net Core 中 System.D
我正在尝试使用Dapper.Contrib使用 .insert() 方法等扩展 IDbConnection 接口(interface)的功能。 为此,我遵循了一些简短且分散的文档 here和 here
注入(inject)连接字符串与 IDbConnection 实例的权衡是什么? ? 我使用 StructureMap 将各种服务注入(inject)到我的 ASP.NET MVC 应用程序中,其中大
我想知道关于在 .Net 应用程序中维护与数据库的连接的最佳做法是什么(ADO.NET,但我想这种做法对于任何数据层都应该是相同的)。我应该创建一个数据库连接并将其传播到我的整个应用程序,还是只传递连
在 Dapper 中使用 BeginTransaction() 和 IDbConnection 的正确方法是什么? 我创建了一个方法,我必须在其中使用 BeginTransaction()。这是代码。
我是一名优秀的程序员,十分优秀!