SQL数据使用IEnumerable返回类型有什么坑吗?我的问题是基于以下代码的SQL连接状态、负载等:publicIEnumberableGetMyTypeObjects(){stringcmdTxt="select*fromMyObjectTable";using(SqlConnectionconn=newSqlConnection(connString)){using(SqlCommandcmd=newSqlCommand(cmdTxt,conn)){conn.Open();using(SqlDataReaderreader=cmd.ExecuteReader()){while(reader.Read()){yieldreturnMapper.MapTo(reader);}}}}产量中断;我可以看到如果在IEnumerable对象的迭代之间有许多进程运行类似的代码,执行时间很长,因为连接将打开更长的时间等,这可能会成为一个问题。但是,这似乎也可能会减少CPU使用率SQL服务器,因为它仅在使用IEnumerable对象时返回数据。它还降低了客户端的内存使用量,因为客户端在工作时只需要加载一个MyType实例,而不是加载所有出现的MyType(通过遍历整个DataReader并返回一个List或其他东西)。我不会使用它,因为它隐藏了正在发生的事情,并且它可能会在没有正确处理的情况下留下数据库连接。连接对象将在读取完最后一条记录后关闭,如果读取在此之前停止,则不会被释放。例如,如果您知道结果中始终有十条记录,并且只有一个循环从枚举器中读取这十条记录而不进行最后一项的第十一次读取调用,则连接未正确关闭。另外,如果只想使用部分结果,则不能在不读取其余记录的情况下关闭连接。即使枚举器的内置扩展也会导致这种情况,即使您正确使用它们也是如此:foreach(MyTypeiteminGetMyTypeObjects().Take(10)){...}这不是我会遵循的模式。我不会像服务器锁定时那样担心服务器上的负载。按照这种模式将数据检索过程集成到您的业务逻辑流中似乎是一个全面的问题解决方案;当你插入它时,你不知道在迭代方面会发生什么。检索数据一次,然后允许客户端代码在阅读器关闭后枚举它。我建议不要进行预优化。在许多情况下,连接将被合并。我也不希望SQLServer上的负载有任何差异-查询已经编译并将运行。我担心的是您将自己完全置于客户端代码的摆布之下。您已经提到调用代码可能使连接保持打开状态的时间超过绝对必要的时间,但也有可能永远不允许关闭/处置该对象。只要客户端代码使用foreach、usingetc或显式调用枚举器的Dispose方法,就可以了,但没有什么能阻止它做这样的事情:有什么陷阱吗?如果分享的内容对你有用,需要了解更多C#学习教程,希望你多多关注——vare=GetMyTypeObjects().GetEnumerator();e.MoveNext();//打开连接等//忘记枚举器并离开并做其他事情//现在读取器、命令和连接不会被关闭/处理//直到GC启动并调用他们的终结器Infringement,请点击右边联系管理员删除。如需转载请注明出处:
