【发布时间】:2009-05-29 14:14:26
【问题描述】:
我正在维护一个用 C# 编写的内部 ORM,它目前没有任何急切加载机制。为了提高性能,我们决定它需要预先加载,因此我们需要编写自己的代码来支持它。 (我和我的同事对任何 ORM 工具都没有任何经验,此外,由于一些遗留原因,我们不允许使用 LinqtoSQL、Entity Framework 或 Nhibernate 等流行工具。)
我的问题是,生成预加载 SQL 语句的公认最佳做法是什么?我想了想,想出了两个办法——
假设 4 个表的经典示例 - 一个 CustomerCategory 有很多 Customer 一个客户有很多订单 一个 Order 有很多 OrderDetail
并假设我想从所有 4 个表中预加载数据,并且我的条件是 - 其中 Order.OrderDate 在 '2008-05-05' 和 '2008-12-31' 之间
方法 1 - 我生成一个 sql 来从所有 4 个表中获取数据,所有表都使用内部连接,以便我为每个表的主键的每个唯一组合获得一行。我会将我的 Where 条件应用于此 sql。
方法 2 - 我生成一个 SQL 以首先仅获取订单数据,并将我的 Where 条件应用于此 sql,因为 Order.OrderDate 来自 Order 表。 然后,根据此查询的结果,我将知道我需要的所有订单 ID 值,因此我将使用这些来检索订单详细信息数据。我还将知道我需要的所有唯一客户 ID 值,因此我还将使用这些值从客户表中检索数据,最后我将对 CustomerCategory 执行相同的操作。这种方法总共需要 4 条 SQL 语句。
我看到第一种方法效率更高,但我的一位同事指出,第二种方法虽然使用了 4 条 SQL 语句,但更易于编写和维护,我同意。
对此的任何想法将不胜感激。 谢谢!
【问题讨论】: