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

时间:2012-06-26 10:33:16

标签: c# .net linq linq-to-sql orm

我正在使用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....

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

非常感谢你的建议,

1 个答案:

答案 0 :(得分:1)

这个blog article描述了如何暂时从DataContext实例中删除DataLoadOptions。

  

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


如果您知道要发送的sql,可以跳过转换步骤并使用DataContext.ExecuteQuery<Product>