2

像许多人一样,我试图从我的应用程序中获得最佳性能,同时保持代码尽可能简单和可读。我正在使用 Linq-to-SQL,并且我真的试图让我的数据层尽可能地具有声明性。

我假设 SQL 调用是最昂贵的操作。因此,我尽量减少它们的数量,但尽量避免难以优化的疯狂复杂查询。

恰当的例子:我将DataLoadOptions与我的 DataContext 一起使用——它的目标是通过预加载相关实体来最小化查询的数量。(又名,急切加载与延迟加载。)

问题:Linq 使用连接来实现目标。与所有事情一样,这是一种权衡。我得到的查询越来越少,但那些加入的查询更加复杂和昂贵。进入 SQL Profiler 可以清楚地说明这一点。

所以,我想在 Linq 中有一个选项可以在没有 joins 的情况下预加载。这可能吗?下面是它的样子:

我有一张Persons桌子,一张Items桌子,一张PersonItems桌子来提供多对多的关系。加载人员集合时,我希望也急切地加载他们所有的 PersonItems 和 Items。

Linq 当前使用一个包含两个连接的大型查询来执行此操作。我宁愿它做的是三个非连接查询:一个用于 Persons,一个用于与这些 Persons 相关的所有 PersonItems,一个用于与这些 PersonItems 相关的所有 Items。然后 Linq 会自动将它们排列到相关实体中。

其中的每一个都是快速的、firehose 类型的查询。从长远来看,它将允许可预测的网络规模性能。

见过做过吗?

4

1 回答 1

0

我相信您描述的三个非连接查询在哪里完成基本上是在执行单个连接查询时发生的事情。我可能是错的,但如果是这种情况,单个查询将更有效,因为只涉及一个数据库查询而不是三个。如果您遇到性能问题,我会确保您加入的列已编入索引(您应该在 SQL 分析器中看不到表扫描)。如果这还不够,您可以编写一个自定义存储过程来获取您需要的数据(假设您不需要每个对象的每一列,这将允许您使用比索引扫描更快的索引查找),或者,您可以反规范化(跨表重复数据),以便根本不发生连接。

于 2011-03-14T09:35:09.540 回答