2009-11-12 57 views
2

比方說,我有3個表格帖子,郵政標籤和標籤定義了一個多對多的關係。我希望得到一個查找表,這將使我所有與給定的標籤,所以我使用下面的代碼的帖子:爲什麼ToLookup()依賴於Linq2Sql中的加載選項?

return dataContext.PostTags.ToLookup(pt => pt.Tag, pt => pt.Post); 

在單元測試都去罰款,但在實際應用中,它沒有工作。我發現我的單元測試和我的應用程序之間有不同的加載選項。

dataContext.DeferredLoadingEnabled = true;,一切都很好,工作正常,但是當dataContext.DeferredLoadingEnabled = false;,你沒有加載選項從PostTagsPostTag,返回的查詢中包含一個鍵(空)與值的空數組。生成的SQL是

SELECT [t0].[PostID], [t0].[TagID] 
FROM [dbo].[PostTags] AS [t0] 

所以當它生成的查詢,pt => pt.Post回報null和同樣的標籤。

爲什麼在這種情況下Linq2SQL提供程序不能生成正確的SQL?

說明性:通過正確的SQL,將返回正確的Post和Tag對象並允許正確分組它們的任何SQL。

+0

一般來說,我從LoadOptions遠離,並堅持延遲加載。從這個角度來看,如果需要,足夠容易生成相對較快的SQL。 – leppie

+0

現在我們已經在應用程序中使用了loadoptions,我感覺和你一樣。不幸的是,改變整個應用程序的工作方式爲時已晚。在下一個項目中,您可以肯定我會說服我的同事們推遲加載的好處。 –

回答

1

我找到了一種方法,使其工作無論DeferredLoadingEnabled屬性值是什麼,無論是loadoptions:

var lookup = (from pt in dataContext.PostTags 
       select new {pt.Post, pt.Tag}).ToLookup(x => x.Tag, x => x.Post); 
+0

微軟的團隊似乎認爲這是所需的行爲:http://social.msdn.microsoft.com/Forums/en-CA/netfxbcl/thread/b3c13f39-6173-4348-9036-76e8a57a6f4a接受我自己的答案與解決方法。 –