【问题标题】:Why is ToLookup() dependent on load options in Linq2Sql?为什么 ToLookup() 依赖于 Linq2Sql 中的加载选项?
【发布时间】: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


【解决方案1】:

无论 DeferredLoadingEnabled 属性值是什么以及加载选项是什么,我都找到了一种让它工作的方法:

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2019-04-16
  • 2021-07-07
  • 2014-09-18
  • 1970-01-01
  • 1970-01-01
  • 2012-11-17
  • 2016-05-05
  • 1970-01-01
相关资源
最近更新 更多