代码之家  ›  专栏  ›  技术社区  ›  Martin Marconcini

LINQ2SQL不会返回与T-SQL相同的结果

  •  2
  • Martin Marconcini  · 技术社区  · 14 年前

    Paciente->PacientTag->标签

    Paciente和带有中间表的Tag之间的典型N:M。

    SELECT Tag.TagName, COUNT(PacienteTag.TagId) AS Totals  FROM Tag
    LEFT JOIN PacienteTag ON Tag.TagId = PacienteTag.TagId
    GROUP BY Tag.TagName
    ORDER BY Tag.TagName
    

    结果是一个简单的表,如下所示:

    Tag1, 0
    Tag2, 0
    Tag3, 0
    Tag4, 2
    Tag5, 0
    Etc…
    

    然而,当我创建我的LINQ2SQL(鉴于我有限的LINQ2SQL知识)版本时,结果如下:

    Tag1, 1
    Tag2, 1
    Tag3, 1
    Tag4, 2
    Tag5, 1
    Etc…
    

    我感到困惑,但或多或少理解了LINQ在做什么,我下载了Linqer并告诉它为我翻译SQL表达式。

    它得出了这样的结论:

    from t in db.Tag
    join t0 in db.PacienteTag on t.TagId equals t0.TagId into t0_join
    from t0 in t0_join.DefaultIfEmpty()
    group t by new {
      t.TagName
    } into g
    orderby
      g.Key.TagName
    select new {
      g.Key.TagName,
      Totals = (Int64?)g.Count()
    }
    

    但事实并非如此

    我可以看出错误在哪里,但我不能提供替代方案。

    我做错了什么?

    注意:在上面的示例中,表PacientTag有两条记录将Tag4与两个随机患者关联,我的T-SQL返回的是正确的值。

    思想?

    1 回复  |  直到 14 年前
        1
  •  3
  •   mkedobbs    14 年前

    假设您的关系设置正确,并且从名为PacientTags的标记中引用了PacientTags,那么以下操作应该可以正常工作。

    from t in db.Tag orderby t.TagName 
    select new { t.TagName, Totals = g.PacienteTags.Count() };
    

    (任何事情) 这是非常罕见的。。。只需利用生成的引用获取其他表中的数据(或使用EF的实体)。