【问题标题】:how group by in Linq with 2 Field?如何在 Linq 中使用 2 个字段分组?
【发布时间】:2009-05-23 13:09:39
【问题描述】:

如何在 Linq 中使用 2 个字段进行分组?

(from i in info 
 group i by i.OrderId into g 
 select new { orderId = g.Key, infos = g });

不仅使用订单 ID 进行排序,还使用两个字段,如 ...

group by i.orderId And i.City

这会怎样?

【问题讨论】:

    标签: asp.net linq


    【解决方案1】:

    我相信你想要这样的东西:

    var result = from i in info
                 group i by new { OrderId = i.OrderId, City = i.City } into g
                 select new { OrderId = g.Key, Infos = g };
    

    将键创建为匿名类型只允许 LINQ 对匿名类型的所有字段使用默认的相等比较器,这在大多数情况下都可以完成。

    【讨论】:

    • 在使用匿名类型的已编译应用上打开 Reflector 也非常有帮助,因为它有助于理解上述工作的原因。当您需要创建非匿名类型时,您应该如何实现 Equals()、GetHashCode() 等,这也不是一个糟糕的指南……
    • @Josh:是的,这可能是一个很好的建议。话虽如此,与在用户定义类型中使用默认比较器相比,您通常可以(并且需要)做得更好。
    【解决方案2】:

    作为 Noldorin 回答的后续措施,当匿名类型上的字段名称与您设置的字段匹配时,您可以省略它们。

    例子:

    var result = from i in info
                 group i by new { i.OrderId, i.City } into g
                 select new { OrderId = g.Key, Infos = g };
    

    【讨论】:

      【解决方案3】:

      Noldorin 和 Josh Einstein 的答案的另一个后续行动...OrderID 将采用整个密钥...在这种情况下,它是一个具有两个属性 OrderID 和 City 的新对象。如果您的最终结果集需要 OrderID 为 OrderID,那么您需要执行以下操作:

      var result = from i in info
                   group i by new { i.OrderId, i.City } into g
                   select new { OrderId = g.Key.OrderId, Infos = g };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-02-20
        • 2013-10-07
        • 1970-01-01
        • 2016-09-15
        • 2010-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多