Linq2Sql:即使返回单个记录,也始终执行 LEFT JOIN

Posted

技术标签:

【中文标题】Linq2Sql:即使返回单个记录,也始终执行 LEFT JOIN【英文标题】:Linq2Sql : always perform LEFT JOIN even if single record is returned 【发布时间】:2012-06-26 10:33:15 【问题描述】:

我正在使用 Linq2Sql(我的客户卡在 3.5,所以我无法迁移到实体框架)来访问 SQL Server 数据库。

为了在某些情况下提高性能,我已将 LoadOptions 附加到我的上下文中。 当我使用编译查询时,我无法禁用它,当它们无用并且它们减慢请求时也是如此。

但有时我想检索数据,就像我的上下文中没有附加 LoadOptions 一样。

作为一种解决方法,我尝试返回的不是完整记录,而是它的投影。

例子:

DataLoadOptions dlo = new DataLoadOptions();
dlo.LoadWith<Product>(c => c.X);
dlo.LoadWith<Product>(c => c.Y);
context.LoadOptions = dlo;

return (from product in context.Products
        where ...
        select product).First();

这会执行如下查询:

Select product.*, X.*, Y.* from Product Left outer join X left outer join Y where....

在这种情况下,一切都很正常。

我的方法依赖于这样的东西:

return (from product in context.Products
        where ...
        select new MyType()  p = product.Field ).First();

执行类似

的查询
Select product.Field from Product ->Left outer join X left outer join
Y<-- where....

请注意请求中的 LEFT OUTER JOIN。

虽然我期待类似的东西:

Select product.Field from Product where....

所以我想知道是否有办法避免这些连接?

非常感谢您的建议,

【问题讨论】:

表 X 和 Y 与表 Product 有什么关系? X 和 Product 以及 Y 和 Product 之间是否存在外键关系? 是的,产品的外键在 X et Y 中。 【参考方案1】:

此blog article 描述了如何临时从 DataContext 实例中删除 DataLoadOptions。

您只需要更改私有 loadOptions 字段的值 您的 DataContext 以更改加载选项


如果你知道要发送的sql,可以跳过翻译步骤,直接使用DataContext.ExecuteQuery&lt;Product&gt;

【讨论】:

这是一篇很棒的文章,但是我想避免反思或类似的技巧。它适用于重负载生产应用程序,这种方法和(例如)文章第二部分(关于编译查询和对象跟踪)的警告有点吓人。由于我还在应用程序中使用 CompiledQueries、LoadOptions、ObjectTracking...,尽管只使用 L2S 的“本机”功能,但我很难稳定它...

以上是关于Linq2Sql:即使返回单个记录,也始终执行 LEFT JOIN的主要内容,如果未能解决你的问题,请参考以下文章

MS Access 记录数始终为 1,即使没有记录

即使启用了 SSL,Request.URL 也始终返回 http

即使从“未优化的应用程序”中删除 PowerManager.isIgnoringBatteryOptimizations 也始终返回 true

LINQ2SQL 事务的性能

刷新 iOS IAP 收据以恢复购买始终会返回收据,即使未进行任何购买也是如此

即使模拟设置为 Off,Settings.Secure.ALLOW_MOCK_LOCATION 也始终返回 1