使用Max在Linq中分组:如何获得最大值的完整数据集?

时间:2017-01-11 16:50:18

标签: c# entity-framework linq group-by

到目前为止我得到的是:

var a = from e in tcdb.timeclockevent
        group e by e.workerId into r
        select new { workerId = r.Key, Date = r.Max(d => d.timestamp) };

此查询为我提供了最新的"时间戳"每个workerId(注意:workerId不是tcdb.timeclockevent的主键)。所以它只给我两对值,但我需要整个数据集

有没有人知道如何使用每个workerId的最大时间戳获取tcdb.timeclock的整个数据集?

OR

有人知道我如何获得每个工人的最大日期数据集的ID吗?

提前谢谢你:)

2 个答案:

答案 0 :(得分:1)

您可以按r订购timestamp分组,然后选择第一个

var a = from e in tcdb.timeclockevent
        group e by e.workerId into r
        select r.OrderByDescending(d => d.timestamp).FirstOrDefault();

答案 1 :(得分:1)

  

有没有人知道如何使用每个workerId的最大时间戳获取tcdb.timeclock的整个数据集?

嗯,直截了当的查询是这样的:

var queryA =
    from e in tcdb.timeclockevent
    group e by e.workerId into g
    let maxDate = g.Max(e => e.timestamp)
    select new { workerId = g.Key, events = g.Where(e => e.timestamp == maxDate) };

如果您不需要IQueryable<T>结果,并且由于没有直接返回分组结果集的SQL构造,您可以尝试以下查询,该查询使用不同的方式过滤最大记录数据库中每个workerId的时间戳,然后在内存中进行分组:

var queryB = tcdb.timeclockevent
    .Where(e => !tcdb.timeclockevent.Any(e2 =>
        e2.workerId == e.workerId && e2.timestamp > e.timestamp))
    .AsEnumerable()
    .GroupBy(e => e.workerId);

您可以尝试查看哪种方法可以更好地处理您的数据。