【问题标题】:LINQ Max Date with group byLINQ Max Date with group by
【发布时间】:2013-02-19 23:25:32
【问题描述】:

我需要按 1) 不同项目出现的次数对列表进行排序,然后 2) 如果两个不同行的计数相同,则为该组的最近使用日期。

我的按功能分组和按计数排序在没有日期的情况下工作:

(from x in data
group x by new { x.Col1, x.Col2, x.Col3} 
into g
let count = g.Count()
select new
{
    g.Key.Col1,
    g.Key.Col2,
    g.Key.Col3,
    count
}).OrderByDescending(x => x.count)

但是,我一直无法成功添加日期排序。我试图将日期列作为聚合添加到 group by 表达式中,但这不起作用。

(from x in data
group x by new { x.Col1, x.Col2, x.Col3, MaxDate = x.CreatedDateTime.Max()}
into g
let count = g.Count()
select new
{
    g.Key.Col1,
    g.Key.Col2,
    g.Key.Col3,
    count,
    g.Key.MaxDate
}).OrderByDescending(x => x.count).ThenByDescending(x => x.MaxDate)

我明白为什么它不起作用,我只是想不出另一种方法来添加二级排序。任何想法表示赞赏!

【问题讨论】:

    标签: linq


    【解决方案1】:

    这就是你要找的(我认为)

    from x in data
    group x by new { x.Col1, x.Col2, x.Col3} 
    into g
    let count = g.Count()
    select new
    {
        g.Key.Col1,
        g.Key.Col2,
        g.Key.Col3,
        MaxDate = g.Select(x => x.CreatedDateTime)
                   .OrderByDescending(d => d).FirstOrDefault(),
        count
    }).OrderByDescending(x => x.count).ThenByDescending(x => x.MaxDate)
    

    【讨论】:

    • 对于 MaxDate,此查询提取整个数据行作为 MaxDate 列的类型。我得试一试,看看能不能缩小范围。
    • 是的,你的权利。幕后是什么,像 linq to sql、实体框架之类的东西?
    • “data”是自定义数据IList
    • 没关系,我编辑了一下。但是您的数据来源(如实体框架)可能会排除某些构造。
    • 行得通!谢谢一堆。我没有得到“.OrderByDescending(d => d)”部分,但我的 LINQ-foo 很弱。我得查一下。
    【解决方案2】:

    怎么样:

        var ordered = Elev8SnaTowelTables
            .GroupBy(x => new { x.Col1, x.Col2, x.Col3 })
            .OrderByDescending(g => g.Count())
            .ThenByDescending(g => g.Max(x => x.CreatedDateTime));
    

    【讨论】:

      猜你喜欢
      • 2011-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-21
      相关资源
      最近更新 更多