为什么ToLookup()依赖Linq2Sql中的加载选项?

Asked
Viewd265

2

让我们说我有3个表Posts,PostTags和Tag定义了多对多关系。我想获得一个查找表,该表将为我提供与给定标签相关的所有帖子,因此我使用以下代码:

 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,而Tag也是如此。

在这种情况下,为什么Linq2SQL提供程序无法生成正确的SQL?

说明:通过正确的SQL,可以返回正确的Post和Tag对象并允许对其进行正确分组的任何SQL。

  • 通常,我远离LoadOptions并坚持延迟加载。从这种角度来看,足够容易生成相对快速的SQL。

    leppieNovember 12, 2009 19:47
  • 现在我们已经在应用程序中使用了loadoptions,我对您的选择也有同样的感觉。不幸的是,改变整个应用程序的工作方式为时已晚。在下一个项目中,您可以肯定地说服我的同事延迟加载的好处。

    Marcel GosselinNovember 12, 2009 20:15

1 个答案

1

我找到了一种使它工作的方法,无论DeferredLoadingEnabled属性值是什么,以及无论loadoptions是什么:

 var lookup = (from pt in dataContext.PostTags
              select new {pt.Post, pt.Tag}).ToLookup(x => x.Tag, x => x.Post);
 
  • Microsoft的团队似乎认为这是理想的行为:http://social.msdn.microsoft.com/Forums/en-CA/netfxbcl/thread/b3c13f39-6173-4348-9036-76e8a57a6f4a接受我自己的回答解决方法。

    Marcel GosselinNovember 20, 2009 14:00