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

LINQ:关于groupby的帮助,似乎不像SQL那样工作:-)只允许我返回。键和其他什么都不允许?

  •  2
  • Martin  · 技术社区  · 15 年前

    我有下面的linq查询,它被分组

      var results = from c in C
         join h in h on c.Code equals
            h.Code
         join m in M on c.Code equals
            m.Code
              group c by c.Code into g
                select
                  new 
                  {
                     Group = g.Key,
                     Total = g.Count()
                  }
    

    很好,返回2条记录,1项共有4条记录,另一项共有2条。太棒了!但我只返回分组字段。。。

    在H表上还有一个名为tDate的字段,在M表上有一个名为pCode的字段。

    现在我试着将我的选择改为像say一样,但是linqpad抱怨m和h变量,因为我认为它们不包括在组中。。。但这就是我迷路的地方。。如何返回group by上的更多字段。当然,pCode和tDate对于组中的每个记录都是一样的,通过。。。因此,我还是应该得到2条记录,但更多的列。

                select
                  new 
                  {
                     Group = g.Key,
                     Total = g.Count(),
                     PCode = m.pCode,
                     TDate = h.tDate
                  }
    

    任何人都能帮我一把。。。。

    提前谢谢

    4 回复  |  直到 15 年前
        1
  •  1
  •   Amy B    15 年前

    当您说“into”时,您将从 into ,只保留在 进入之内 .

    var results =
      from c in C 
      group c by c.Code into g 
      select new
      { 
        Group = g.Key, 
        Total = g.Count() 
      } into x
      from c2 in x
      join h in h on c2.Group equals h.Code 
      join m in M on c2.Group equals m.Code
      select new
      { 
        Group = x.Group, 
        Total = x.Total,
        PCode = m.pCode, 
        TDate = h.tDate
      };
    
        2
  •  2
  •   cjk    15 年前

    SQL会给您一个错误,说明列没有作为聚合函数的一部分包含。要包含它们,您必须将它们包括在分组依据中,或者重新连接到数据上以获取与分组数据相关的数据。

        3
  •  2
  •   Tomas Jansson    15 年前

    我认为需要使用聚合函数来获取值。你试过了吗 h.Max(y => y.tDate) 和 m.First(y => y.pCode) ? 我想那可能有用,但我不确定。并非所有函数都是聚合函数。

        4
  •  0
  •   AakashM    15 年前

    当然,对于group by中的每个记录,pCode和tDate都是相同的。

    如果这是真的,您可以将它们作为获取所需结果的键的一部分:

    var results = 
          from c in C
          join h in H on c.Code equals h.Code
          join m in M on c.Code equals m.Code
          group c by new { cCode = c.Code, pCode = m.pCode, tDate = h.tDate } 
              into g
          select
              new
                  {
                      Group = g.Key,
                      Total = g.Count()
                  };
    

    例如,你可以说

    var firstcCode = results.First().Group.cCode;
    var firstpCode = results.First().Group.pCode;
    var firsttDate = results.First().Group.tDate;
    

    如果我引用的声明 不是 是的,那么正如在其他答案中所建议的,就像在SQL中一样,您需要调用一个聚合函数来说明如何处理(可能是多个) pCode 给定值 cCode .