代码之家  ›  专栏  ›  技术社区  ›  Marcel Gosselin

为什么tolookup()依赖于linq2sql中的加载选项?

  •  2
  • Marcel Gosselin  · 技术社区  · 15 年前

    假设我有3个表,post,post标签和定义多对多关系的标签。我想得到一个查找表,它将为我提供与给定标签相关的所有文章,因此我使用以下代码:

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

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

    什么时候? dataContext.DeferredLoadingEnabled = true; 一切都很好,按预期工作,但什么时候 dataContext.DeferredLoadingEnabled = false; 你没有加载选项 PostTags Post Tag ,返回的查找包含一个值为空数组的单键(空)。生成的SQL是

    SELECT [t0].[PostID], [t0].[TagID]
    FROM [dbo].[PostTags] AS [t0]
    

    所以当它生成查找时, pt => pt.Post 收益率 null 标签也是如此。

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

    澄清 :根据正确的SQL,返回正确的post和tag对象并允许对其进行正确分组的任何SQL。

    1 回复  |  直到 15 年前
        1
  •  1
  •   Marcel Gosselin    15 年前

    我找到了一种方法,无论延迟的loadingabled属性值是什么以及loadOptions是什么:

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