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

时间:2009-11-12 19:28:02

标签: .net linq linq-to-sql lookup eager-loading

假设我有3个表格定义多对多关系的帖子,帖子标签和标签。我想得到一个查找表,它会给我所有与给定标签相关的帖子,所以我使用以下代码:

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

在单元测试中一切都很顺利,但在实际应用中,它没有用。我发现我的单元测试和我的应用程序之间有不同的加载选项。

dataContext.DeferredLoadingEnabled = true;时,一切正常且按预期工作但dataContext.DeferredLoadingEnabled = false;时你没有从PostTagsPost和{{1}的加载选项返回的查找包含一个键(null),其值为空数组。生成的SQL是

Tag

因此,当它生成查找时,SELECT [t0].[PostID], [t0].[TagID] FROM [dbo].[PostTags] AS [t0] 会返回pt => pt.Post,而标记也是如此。

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

澄清:通过正确的SQL,任何返回正确的Post和Tag对象并允许正确分组的SQL。

1 个答案:

答案 0 :(得分:1)

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

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