【发布时间】:2009-11-12 19:28:02
【问题描述】:
假设我有 3 个表 Posts、PostTags 和 Tags 定义多对多关系。我想获得一个查找表,它将为我提供与给定标签相关的所有帖子,因此我使用以下代码:
return dataContext.PostTags.ToLookup(pt => pt.Tag, pt => pt.Post);
在单元测试中一切正常,但在实际应用程序中,它不起作用。我发现我的单元测试和我的应用程序之间有不同的加载选项。
当dataContext.DeferredLoadingEnabled = true; 时,一切正常并且按预期工作,但是当dataContext.DeferredLoadingEnabled = false; 并且您没有从PostTags 到Post 和Tag 的加载选项时,返回的查找包含一个键( null) 具有一个空数组作为值。生成的 SQL 是
SELECT [t0].[PostID], [t0].[TagID]
FROM [dbo].[PostTags] AS [t0]
因此,当它生成查找时,pt => pt.Post 返回 null,标签也是如此。
在这种情况下,为什么 Linq2SQL 提供程序不能生成正确的 SQL?
澄清:通过正确的 SQL,任何能够返回正确的 Post 和 Tag 对象并允许对它们进行正确分组的 SQL。
【问题讨论】:
-
通常我远离 LoadOptions 并坚持延迟加载。从这个角度来看,如果需要的话,很容易生成相对快速的 SQL。
-
现在我们已经在我们的应用程序中使用了加载选项,我对它们的感觉和你一样。不幸的是,改变整个应用程序的工作方式为时已晚。在下一个项目中,您可以肯定我会让我的同事相信延迟加载的好处。
标签: .net linq linq-to-sql lookup eager-loading