像许多人一样,我试图从我的应用程序中获得最佳性能,同时保持代码尽可能简单和可读。我正在使用 Linq-to-SQL,并且我真的试图让我的数据层尽可能地具有声明性。
我假设 SQL 调用是最昂贵的操作。因此,我尽量减少它们的数量,但尽量避免难以优化的疯狂复杂查询。
恰当的例子:我将DataLoadOptions与我的 DataContext 一起使用——它的目标是通过预加载相关实体来最小化查询的数量。(又名,急切加载与延迟加载。)
问题:Linq 使用连接来实现目标。与所有事情一样,这是一种权衡。我得到的查询越来越少,但那些加入的查询更加复杂和昂贵。进入 SQL Profiler 可以清楚地说明这一点。
所以,我想在 Linq 中有一个选项可以在没有 joins 的情况下预加载。这可能吗?下面是它的样子:
我有一张Persons
桌子,一张Items
桌子,一张PersonItems
桌子来提供多对多的关系。加载人员集合时,我希望也急切地加载他们所有的 PersonItems 和 Items。
Linq 当前使用一个包含两个连接的大型查询来执行此操作。我宁愿它做的是三个非连接查询:一个用于 Persons,一个用于与这些 Persons 相关的所有 PersonItems,一个用于与这些 PersonItems 相关的所有 Items。然后 Linq 会自动将它们排列到相关实体中。
其中的每一个都是快速的、firehose 类型的查询。从长远来看,它将允许可预测的网络规模性能。
见过做过吗?