【问题标题】:Linq GroupBy Max and add columnLinq GroupBy Max 并添加列
【发布时间】:2015-11-21 15:16:16
【问题描述】:

我需要显示跟踪日志中的最后一个活动,并按 ClientId 和最后一个活动日期分组。我的代码工作正常。

我现在需要在结果中添加另一列,即“备忘录”字段。

结束查询将是 ClientId 的 Last Tracking Date 和该行的“Memo”字段。

工作代码(无备注字段)

var q =(
from t in Trackings
group t by t.ClientID into g
select new {ClientID = g.Key, Date = g.Max(x=>x.TrackDate)} 
).ToList();

结果:

46, 10/29/2015 12:09:42 PM 
69, 11/1/2015 5:44:47 AM 
29, 11/6/2015 12:55:21 PM 

期望的结果

46, 10/29/2015 12:09:42 PM, User Login 
69, 11/1/2015 5:44:47 AM, Update Account
29, 11/6/2015 12:55:21 PM, User Login

如何在 GroupBy 和 MAX 选择完成后添加另一列并获取 ROW 的 MEMO?

【问题讨论】:

    标签: c# linq group-by max


    【解决方案1】:

    我认为这种查询最方便的方法是按日期降序排序并取第一条记录:

    var q =(from t in Trackings
            group t by t.ClientID into g
            let lastTracking = g.OrderByDescending(x => x.TrackDate).FirstOrDefault()
            select new 
            {
                ClientID = g.Key, 
                Date = lastTracking.TrackDate,
                Memo = lastTracking.Memo
            }).ToList();
    

    【讨论】:

    • 是的,你是正确的 +1。您可以警告 OP 可能由于 FirstOrDefault 而发生 NRE。
    • 没错,但我将其留给 OP。 Trackings 可能是来自 SQL 后端的 IQueryable,在这种情况下,空值检查将不适用。
    • @RahulSingh NRE 永远不会发生在没有额外过滤器的分组上。通常会使用First,但出于某种未知原因,EF 不喜欢它,而是需要FirstOrDefault
    • @IvanStoev 我什至没有想到这一点:) 当然,该组总是有人。如果没有ClientId,则没有群组。
    • @IvanStoev - 我想你误会了 :) 我在谈论 NRE 在lastTracking.Memo 的可能性不在分组中。
    【解决方案2】:

    你需要添加

    var q =(
    from t in Trackings
    group t by t.ClientID into g
    select new {ClientID = g.Key, Date = g.Max(x=>x.TrackDate),MemoField=g.First().select(x=>x.MemoField)} 
    ).ToList();
    

    【讨论】:

    • 不——导致所有 MEMO 字段 .. 不只是行的 1。
    • 这将获取每个组中的第一项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 2017-02-08
    • 2016-05-23
    • 2018-01-19
    • 1970-01-01
    相关资源
    最近更新 更多