Dapper什么时候“实体化”?Like Entity 在 ToList() 中具体化

Nec*_*age 4 orm entity-framework dapper

标题基本概括了所有内容。由于 Dapper 没有太多文档。提前致谢。

bbs*_*nbb 5

Query() 返回一个 IEnumerable。当您开始迭代 IEnumerable 时,在 Dapper 内部会使用 Yield 调用一些方法,以用一行结果填充 POCO,因此当您迭代它们时,您的结果会逐渐具体化。执行此操作时,您需要保持数据库连接打开,因为不能保证结果集的所有行都会立即返回。事实上,对于大型结果集,您希望能够循环遍历它们,而无需将整个结果集存储在应用程序的内存中。在任何时候,您都可以在 IEnumerable 上调用 ToList(),然后您就已经实现了所有内容,并且可以关闭连接。

在底层,整个堆栈针对分页进行了优化。ADO 具有页面大小属性。如果您迭代 IEnumerable,您不知道也不关心这些页面有多大,但您应该了解它们的存在,并且检索页面的性能成本与页码直接相关。您进入结果集的距离越远,每页的检索成本就越高。

为了提高应用程序的性能,您可以做的最重要的事情就是精通 SQL,并将投影的所有逻辑放入 SQL 中,返回较小的结果集,并避免需要具体化然后操作大型结果集C#。这显然是一个很大的概括,但确实如此。我说了。