我想知道迭代数据读取器对象时的连接状态以及“yield”对代码性能的影响

2024-01-11

这是我用来从数据库获取数据的示例代码: 在 DAO 层:

public IEnumerable<IDataRecord> GetDATA(ICommonSearchCriteriaDto commonSearchCriteriaDto)
{
    using(DbContext)
    {
        DbDataReader reader = DbContext.GetReader("ABC_PACKAGE.GET_DATA", oracleParams.ToArray(), CommandType.StoredProcedure);
        while (reader.Read())
        {
            yield return reader;
        }
    }
}

在 BO 层上,我调用上述方法,如下所示:

List<IGridDataDto> GridDataDtos = MapMultiple(_costDriversGraphDao.GetGraphData(commonSearchCriteriaDto)).ToList();

在映射器层 MapMultiple 方法定义如下:

public IGridDataDto MapSingle(IDataRecord dataRecord)
{
    return new GridDataDto
    {
        Code = Convert.ToString(dataRecord["Code"]),
        Name = Convert.ToString(dataRecord["Name"]),
        Type = Convert.ToString(dataRecord["Type"])     
    };
}
public IEnumerable<IGridDataDto> MapMultiple(IEnumerable<IDataRecord> dataRecords)
{
    return dataRecords.Select(MapSingle);
}

上面的代码运行良好,但我想知道上面的代码有两个问题。

  1. 数据读取器的连接将打开多长时间?
  2. 当我仅考虑代码性能因素时,使用“yield return”而不是将记录添加到列表中并返回整个列表是一个好主意吗?

  1. 您的代码不显示您打开/关闭连接的位置;但是reader这里实际上只会开放当你迭代数据时。延迟执行等。执行此操作的代码中唯一的部分是.ToList(),所以会没事的。在更一般的情况下,是的:读者将开放您迭代它所花费的时间;如果你做一个.ToList()这将是最小的;如果你做一个foreach并且(对于每个项目)发出外部 http 请求并等待 20 秒,然后是的 - 它将打开更长时间。
  2. 两者都有各自的用途;非缓冲方法非常适合您想要作为流处理的巨大结果,而无需将它们加载到单个内存列表中(甚至一次将它们全部放入内存中);返回列表可以使连接快速关闭,并且可以轻松避免在已经有打开的读取器时意外使用该连接,但对于大型结果而言并不理想

如果返回一个迭代器块,调用者可以决定什么是正常的;如果你总是返回一个列表,他们就没有太多选择。第三种方法(我们在衣冠楚楚的情况下这样做)是让他们做出选择;我们有一个可选的bool参数默认为“返回列表”,但调用者可以更改该参数以指示“返回迭代器块”;基本上:

bool buffered = true

在参数中,并且:

var data = QueryInternal<T>(...blah...);
return buffered ? data.ToList() : data;

在实施中。在大多数情况下,返回列表是完全合理的,并且可以避免很多问题,因此我们将其设为默认值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我想知道迭代数据读取器对象时的连接状态以及“yield”对代码性能的影响 的相关文章

  • 将 IRandomAccessStreamWithContentType 转换为 Byte[]

    在我的应用程序中 我允许用户使用 ContactPicker 添加联系人 我尝试将 IRandomAccessStreamWithContentType 转换为 Byte IRandomAccessStreamWithContentType
  • 在业务逻辑中使用反射是一种好的做法吗?

    我需要开发一个由两个主要部分组成的应用程序 具有特定业务类别的业务逻辑部分 例如书籍 图书馆 作者 一个通用部分 可以在数据网格中显示书籍 图书馆 将它们映射到数据库 通用部分使用反射从业务类中获取数据 而不需要在业务类中编写特定的数据网格
  • 为什么 std::move() 没有窃取 int 值? [复制]

    这个问题在这里已经有答案了 std move 正在窃取字符串值 而不是 int 请帮助我 int main int i 50 string str Mahesh int j std move i string name std move s
  • Visual Studio 2019:如何使用平台工具集 v140_xp?

    我正在尝试使用 Visual Studio 2019 编译适用于 Windows XP 的应用程序 为此 我尝试使用平台工具集 v140 xp 它不起作用 出现以下错误消息 C Program Files x86 MSBuild Micro
  • 类库的 app.config 中的绑定重定向有什么作用吗?

    我经常使用的 VS 解决方案包括单个可执行项目 控制台应用程序 网络应用程序 和许多类库项目这些都被可执行文件引用 使用 NuGet 并安装包时 经常会出现app config为每个项目创建的文件 通常只包含合并引用程序集版本的绑定重定向列
  • 虚拟调用与类型检查的另一个例子

    Problem 我发誓 每次我脑子里都在想 我应该使用虚拟调用而不是类型检查 例如 if obj is Foo else if obj is Bar 我想出了另一个例子 我不知道如何实现前者 我正在通过串行端口实现分组协议 一些伪代码可以最
  • Listbox手动DrawItem大字体

    我正在尝试绘制末端是一个的项目 红色字符 并将其删除 字符 并用黑色绘制其他项目 这是我的代码 private void listBox1 DrawItem object sender DrawItemEventArgs e e DrawB
  • 泛型和实现 IComparable

    我对泛型非常陌生 我正在尝试编写一个简单的类 它将是泛型的 但也允许对字符串成员变量的一些描述进行排序 目前我有一个基本类 但是当我尝试实现接口成员 CompareTo 时 我在顶部收到一个错误 告诉我它尚未实现 这里有什么问题呢 usin
  • C# 中 a+=1 和 a=a+1 的区别

    我发现在C 中a 1不等于a a 1 例如 以下代码编译时不会出现任何错误 字节 b 10 b 5 而下面的代码有编译错误 字节 b 10 b b 5 有人可以告诉我为什么吗 Because b 5变成整数 Int32 主要是因为有重载的可
  • 如何在asp.net中创建动态复选框

    我正在创建一个需要添加动态复选框列表的应用程序 请任何人告诉我如何使用 C 添加动态复选框列表 在表单上放置一个带有 ID 的占位符placeHolder并将以下代码添加到您的Page Load CheckBoxList cbList ne
  • 如何可靠地判断 boost 线程是否已退出其 run 方法?

    我以为 joinable 会表明这一点 但事实似乎并非如此 在工人阶级中 我试图表明它仍在通过谓词进行处理 bool isRunning return thread gt joinable 已经退出的线程不是不能加入吗 我错过了什么 boo
  • 带有 Null 的 Soap WSDL

    我需要在函数中指定一个可为空的参数 这不起作用
  • 如何在 .NET 中使 ComboBox 不可编辑?

    我想要一个 仅选择 ComboBox它提供了一个项目列表供用户选择 应在文本部分禁用打字ComboBox控制 我最初对此进行谷歌搜索 发现了一个过于复杂 误导性的建议来捕捉KeyPress event 要使 ComboBox 的文本部分不可
  • 如何让一段代码只执行一次?

    我有一个应用程序 其中有多种功能 每个函数都可以根据用户输入多次调用 但是 我只需要在函数中执行一小段代码一次 最初是在应用程序启动时执行 当稍后再次调用同一函数时 不得执行这段特定的代码 代码在VC 请告诉我处理这个问题最有效的方法 使用
  • 如何从 Visual Studio 2012 导出 C# 应用程序以在其他计算机上运行?

    我刚刚在 Visual Studio 2012 中制作了我的第一个 C 应用程序 我想以某种方式导出它 以便其他人可以在他们的计算机 包括没有 Visual Studio 2012 的计算机 中使用它 我该怎么做 我是 C 新手 找不到任何
  • 链接到 C++ 库时在 C 中使用 setjmp 和 longjmp

    我想在链接到用 C 实现的库 但具有 C API 的 C 程序中使用 setjmp 和 longjmp C 代码确实进行动态内存分配 并且指针通过 API 传递 但只要代码的 C 端正确管理这些 不透明 对象 使用 longjmp 时就不应
  • SerialPort.Read(byte[], int32, int32) 不是阻塞的,但我想要它 - 我该如何实现?

    我正在编写一个用于与测试设备通信的接口 设备通过串行端口进行通信 并以已知的字节数响应我发送的每个命令 我当前的结构是 发送命令 读回指定字节数 继续申请 但是 当我使用 SerialPort Read byte int32 int32 时
  • 如何在 Code::Blocks 中启用 C 自动完成?

    如何在 Code Blocks 中启用 C Std lib 函数自动完成 转到 设置 gt 编辑器 gt 代码完成和符号浏览器 并确保未选中 禁用代码完成
  • 从 C# 2.0 中的 dll 获取命名空间、类名

    我将动态获取dll 我需要加载 dll 并获取命名空间 类名来调用方法 方法名称是静态的 它将始终为 OnStart 基本上我需要通过加载 dll 来运行一个方法 有人可以帮忙吗 要加载程序集 您可以这样做 Assembly assembl
  • 静态编译器和运行时编译器等术语的实际含义是什么?

    我正在努力学习更多 C 并尝试了解有关不同编译器及其技术的基础知识 我用谷歌搜索了很多次 但每次我都碰巧遇到需要更多解释的新术语 那么 本主题中的静态编译 动态链接等术语实际上意味着什么 某些语言 例如 C 在开始运行 即实际使用 之前将所

随机推荐