2012-06-26 89 views
0

我正在使用Linq2Sql(我的客戶停留在3.5,因此我無法遷移到實體框架)訪問SQL Server數據庫。Linq2Sql:即使單個記錄返回也總是執行LEFT JOIN

爲了提高某些情況下的性能,我將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.... 

所以我想知道是否有避免這些連接的方法嗎?

非常感謝你對你的忠告,

+0

表X和Y如何與表產品相關? X和產品以及Y和產品之間是否存在外鍵關係? –

+0

是的,產品的外鍵在X和Y. – AFract

回答

1

blog article介紹瞭如何從一個DataContext實例中暫時刪除DataLoadOptions。

你只需要改變 您的DataContext私人loadOptions字段的值更改負載選項


如果你知道你要發送的SQL,你可以跳過翻譯步驟和只使用DataContext.ExecuteQuery<Product>

+0

這是一篇很棒的文章,但我想避免反思或類似的技巧。 這是一個重載生產應用程序,這種方法和(例如)文章第二部分的警告(關於編譯查詢和對象跟蹤)有點令人恐懼。 因爲我也在應用程序中使用CompiledQueries,LoadOptions,ObjectTracking ...,儘管只使用L2S的「本地」特性,但仍然有很多困難來穩定它... – AFract

相關問題