比方說,我有3個表格帖子,郵政標籤和標籤定義了一個多對多的關係。我希望得到一個查找表,這將使我所有與給定的標籤,所以我使用下面的代碼的帖子:爲什麼ToLookup()依賴於Linq2Sql中的加載選項?
return dataContext.PostTags.ToLookup(pt => pt.Tag, pt => pt.Post);
在單元測試都去罰款,但在實際應用中,它沒有工作。我發現我的單元測試和我的應用程序之間有不同的加載選項。
當dataContext.DeferredLoadingEnabled = true;
,一切都很好,工作正常,但是當dataContext.DeferredLoadingEnabled = false;
,你沒有加載選項從PostTags
到Post
和Tag
,返回的查詢中包含一個鍵(空)與值的空數組。生成的SQL是
SELECT [t0].[PostID], [t0].[TagID]
FROM [dbo].[PostTags] AS [t0]
所以當它生成的查詢,pt => pt.Post
回報null
和同樣的標籤。
爲什麼在這種情況下Linq2SQL提供程序不能生成正確的SQL?
說明性:通過正確的SQL,將返回正確的Post和Tag對象並允許正確分組它們的任何SQL。
一般來說,我從LoadOptions遠離,並堅持延遲加載。從這個角度來看,如果需要,足夠容易生成相對較快的SQL。 – leppie
現在我們已經在應用程序中使用了loadoptions,我感覺和你一樣。不幸的是,改變整個應用程序的工作方式爲時已晚。在下一個項目中,您可以肯定我會說服我的同事們推遲加載的好處。 –