假设我有3个表格定义多对多关系的帖子,帖子标签和标签。我想得到一个查找表,它会给我所有与给定标签相关的帖子,所以我使用以下代码:
return dataContext.PostTags.ToLookup(pt => pt.Tag, pt => pt.Post);
在单元测试中一切都很顺利,但在实际应用中,它没有用。我发现我的单元测试和我的应用程序之间有不同的加载选项。
当dataContext.DeferredLoadingEnabled = true;
时,一切正常且按预期工作但dataContext.DeferredLoadingEnabled = false;
时你没有从PostTags
到Post
和{{1}的加载选项返回的查找包含一个键(null),其值为空数组。生成的SQL是
Tag
因此,当它生成查找时,SELECT [t0].[PostID], [t0].[TagID]
FROM [dbo].[PostTags] AS [t0]
会返回pt => pt.Post
,而标记也是如此。
为什么Linq2SQL提供程序在这种情况下不能生成正确的SQL?
澄清:通过正确的SQL,任何返回正确的Post和Tag对象并允许正确分组的SQL。
答案 0 :(得分:1)
无论DeferredLoadingEnabled属性值是什么以及任何loadoptions是什么,我都找到了一种使其工作的方法:
var lookup = (from pt in dataContext.PostTags
select new {pt.Post, pt.Tag}).ToLookup(x => x.Tag, x => x.Post);