Linq to sql 使用Linq到SQL预加载而不使用连接

Linq to sql 使用Linq到SQL预加载而不使用连接,linq-to-sql,eager-loading,Linq To Sql,Eager Loading,和许多人一样,我正试图从我的应用程序中挤出最好的性能,同时尽可能保持代码的简单性和可读性。我正在使用LINQtoSQL,并且正在尽可能地保持数据层的声明性 我的操作假设SQL调用是最昂贵的操作。因此,我尽量减少它们的数量,但尽量避免难以优化的疯狂复杂查询 举个例子:我正在使用我的DataContext——它的目标是通过预加载相关实体来最小化查询的数量。(也就是说,即时加载与延迟加载。) 问题:Linq使用连接来实现目标。与所有事情一样,这是一种权衡。我得到的查询越来越少,但是那些连接的查询更加复

和许多人一样,我正试图从我的应用程序中挤出最好的性能,同时尽可能保持代码的简单性和可读性。我正在使用LINQtoSQL,并且正在尽可能地保持数据层的声明性

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

举个例子:我正在使用我的DataContext——它的目标是通过预加载相关实体来最小化查询的数量。(也就是说,即时加载与延迟加载。)

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

因此,我希望在Linq中有一个选项,可以在没有连接的情况下预加载。这可能吗?下面是它可能的样子:

我有一个
Persons
表、一个
Items
表和一个
PersonItems
表来提供多对多关系。当装载一组人员时,我希望他们所有的人员和物品也能被急切地装载

Linq目前通过一个包含两个连接的大型查询来实现这一点。我希望它做的是三个非连接查询:一个用于person,一个用于与这些personite相关的所有personite,一个用于与这些personite相关的所有项。然后Linq会自动将它们安排到相关实体中

每一个都是一个快速的firehose类型查询。从长远来看,它将实现可预测的web级性能


你见过这样做吗?

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

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

回答起来还不够好,但我想我只是想知道,为什么您似乎对连接有一种自动的负面反应,而没有分析它们是否在性能上更差。另一方面,有人可能会指出,在一个连接中执行多个查询(使用适当的外键)也可以,或者更好。最后,代码可能也会变得更简单。这很公平,尽管我认为复杂性是性能的代表。目前它的性能还不错,但就费用而言,连接似乎必须是指数型的——每连接一行x行。这也是绩效和规模之间的区别。规模是指性能是可预测的,即线性的。这还不足以回答问题,但我想我只是想知道,为什么您似乎对连接有自动的负面反应,而没有分析它们是否真的对性能更差。另一方面,有人可能会指出,在一个连接中执行多个查询(使用适当的外键)也可以,或者更好。最后,代码可能也会变得更简单。这很公平,尽管我认为复杂性是性能的代表。目前它的性能还不错,但就费用而言,连接似乎必须是指数型的——每连接一行x行。这也是绩效和规模之间的区别。规模是指性能是可预测的,即线性的。