【问题标题】:How do you find the group-wise max in LINQ?你如何在 LINQ 中找到分组最大值?
【发布时间】:2011-01-03 08:04:48
【问题描述】:

我正在尝试解决 LINQ 中的“group-wise max”问题。首先,我有一个使用实体框架建模的数据库,其结构如下:

Customer:
---------
CustomerID : Int32
Name : String

Order:
-------
OrderID : Int32
CustomerID : Int32
Total : Decimal

这让我可以从客户导航到她的订单,从订单导航到所有者。

我正在尝试创建一个 LINQ 查询,该查询允许我在数据库中查找前 10 个客户订单。这个简单的案例很容易想出:

var q = (
    from order in _data.Orders  // ObjectQuery<Order>
    orderby order.Amount descending select order
).Take(10);

但是,我只想在此列表中显示唯一身份客户。我对 LINQ 还是有点陌生​​,但这是我想出的:

var q = (
    from order in _data.Orders  // ObjectQuery<Order>
    group order by order.Customer into o
    select new {
        Name = o.Key.Name,
        Amount = o.FirstOrDefault().Amount
    }
).OrderByDescending(o => o.Amount).Take(10);

这似乎可行,但我不确定这是否是最好的方法。具体来说,我想知道这样一个查询对一个非常大的数据库的性能。另外,使用组查询中的FirstOrDefault 方法看起来有点奇怪...

谁能提供一种更好的方法,或者保证这是正确的方法?

【问题讨论】:

    标签: c# linq max groupwise


    【解决方案1】:
    Customer
    .Select(c=>new {Order= c.Orders.OrderByDescending(o=>o.Total).First()})
    .OrderByDescending(o=>o.Total)
    .Take(10);
    

    【讨论】:

      【解决方案2】:

      你可以这样做:

      var q = (
          from order in _data.Orders  // ObjectQuery<Order>
          orderby order.Amount descending select order
      ).Distinct().Take(10);
      

      我通常会查看生成的 SQL,看看什么是最好的。

      【讨论】:

      • 这带来了一个很好的问题......我如何查看生成的 SQL?使用 LINQ to SQL DataContext,我可以记录输出。我还没有为 EF 找到一种方法。
      • Hrm... 尝试这个,我必须创建一个自定义的相等比较器(因为默认的比较器不适用于此目的)。但是,这会引发一个异常,指出 EF 无法识别该方法。有什么想法吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-10
      • 1970-01-01
      • 2016-11-14
      相关资源
      最近更新 更多