我想知道填充业务对象层次结构(父/子/孙子)结构的最佳实践来自单个数据库调用。
我可以想到几种方法来完成它,例如:
左连接我的 sql 语句中的所有关系,然后使用循环和逻辑来填充业务对象
或者
使用几个 select 语句和 1 个 datareader 并使用其 NextResult() 方法遍历每个结果集并填充相应的 BO
只是想知道最好的做法是什么
我正在为我的 DAL 使用 DAAB 和 c#
谢谢!
我想知道填充业务对象层次结构(父/子/孙子)结构的最佳实践来自单个数据库调用。
我可以想到几种方法来完成它,例如:
左连接我的 sql 语句中的所有关系,然后使用循环和逻辑来填充业务对象
或者
使用几个 select 语句和 1 个 datareader 并使用其 NextResult() 方法遍历每个结果集并填充相应的 BO
只是想知道最好的做法是什么
我正在为我的 DAL 使用 DAAB 和 c#
谢谢!
没有通用的食谱。它取决于数据库架构、数据库大小和您的应用程序在典型场景中读取的记录数。您在这里有两个过程:
从数据库中获取数据比在内存中创建对象要慢几个数量级。最好的方法是构造选择语句以实现最快的数据访问。
查询可以通过三种方式构建:
您应该决定哪种解决方案是可以接受的。需要考虑的一些关键点:
我曾经使用多个返回的数据集,但开销和不断变化的 API 最终让我回到只使用连接来一次性返回所有数据集。
我密切关注结果集的大小,但在我遇到的任何应用程序的上下文中,这都不是问题。总的来说,我并不后悔这样做,但 YMMV。
如果父级选择子句涉及子级选择规则,则多个结果集会变得特别松散。
这种方式处理所有情况;有时将其拆分是可行的,但在某些情况下您最终会需要单组查询;并且只有一种模式很好——尤其是如果你有时被从一种模式重构到另一种模式所困。
最后,您最终会减少对数据库的访问,并且事务管理更简单。
DataReader NextResult 是最好的,因为通过管道的数据量不会像连接方法那样快速增长。
您是否考虑过使用诸如 NHibernate 之类的 OR 映射器?急切加载可以在一次调用数据库时完成您所要求的事情。
如果 OR Mapper 不是一个选择,那么我将投票支持 datareader.NextResultSet。
如果所有行都来自同一个表(或看起来是),那么您可以将数据拉入具有一元关系的数据集,ADO.NET 将为您链接层次结构