【问题标题】:Linq group by with a sub query带有子查询的Linq group by
【发布时间】:2009-06-10 16:43:38
【问题描述】:

我有一个包含这三个属性的对象:ID、DATE 和 NAME,我想用 linq 查询它,得到的结果与下面的 sql 语句中的结果相同。

SELECT ID, MAX(DATE), NAME 
FROM TABLE
GROUP BY ID

这是我迄今为止对 linq 的了解:

var grouped = from a in table
group a by a.ID into g
select new fooObject()
{
DATE= g.Max(a => a.DATE),
NAME= g.Select(a => a.Name).ToString(),
ID= g.Select(a => a.ID)
};

提前感谢您的帮助。

【问题讨论】:

    标签: c# sql linq


    【解决方案1】:

    鉴于您的最新解释,这是我提出的解决方案。我也清理了一些代码。

    var grouped = from item in table
                  group item by item.Id into g
                  let itemMaxDate = g.MaxBy(i => i.Date)
                  select new FooObject()
                  {
                      Id = g.Key,
                      Name = itemMaxDate.Name,
                      Date = itemMaxDate.Date
                  };
    

    然后您需要定义MaxBy 扩展方法。 (不幸的是,LINQ 确实包含一个内置的。)

    public static TSource MaxBy<TSource, TResult>(this IEnumerable<TSource> 
        collection, Func<TSource, TResult> func)
    {
        var comparer = Comparer<TResult>.Default;
        TSource maxItem = null;
        foreach (var item in collection)
        {
            if (comparer.Compare(item, maxItem) > 0)
                maxItem = item;
        }
        return maxItem;
    }
    

    我相信这应该是你现在想要的。让我知道它是否适合您。

    【讨论】:

    • "group item by item.ID into group" 需要是"group item by item.ID into g"
    • 我不想在 NAME 上分组。数据如下所示。我想对 ID 进行分组,并使用最大日期和关联的任何名称获取行。 ID DATE NAME 1 1/1/09 SMH 1 1/2/09 ASD 2 1/3/09 FGH 2 1/4/09 JKL 结果将是 ID DATE NAME 1 1/2/09 ASD 2 1/4/ 09 JKL
    • 好的,我现在已经更新了我的答案。应该做你想做的。对于 LINQ,它也应该尽可能高效,因为它使用自定义 MaxBy 方法。
    【解决方案2】:
    var grouped = (from a in table
                   where a.Date == (from d in table where a.ID == d.ID select Date).Max()
                   select a).OrderBy(i => i.ID);
    

    【讨论】:

      【解决方案3】:
      SELECT ID, MAX(DATE), NAME
      FROM TABLE
      GROUP BY ID
      

      选择列表中的“TABLE.NAME”列无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

      【讨论】:

      • 看起来我需要一种不同的方法,也许是子查询?我只想要按 ID 和 MAX(DATE) 分组的记录。
      猜你喜欢
      • 2014-11-01
      • 2015-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多