在 LINQ 中使用 GroupBy 获取最后插入的行

Using GroupBy in LINQ to get last inserted rows

我有一个简单的 table,我想使用 GroupBy 获取最后插入的行。

我有以下代码可以在没有分组的情况下工作,但我想创建一个带有分组的新函数

 public Session FindLastFinished(IdentityUser user)
    {
        return _dbContext.Sessions.OrderByDescending(o => o.CreatedAt).FirstOrDefault(s => s.User.Equals(user) && s.Progress.Equals(Status.Finished.ToString()));
    }

我需要为列 ScenarioId 添加一个分组,以便它 return 每个 ScenarioId 的最后插入的行,但是我在添加 GroupBy 语法时遇到了问题。

public List<Session> FindLastFinishedByScenarios(IdentityUser user)

应该这样做:

_dbContext.Sessions.ToList()
.GroupBy(x => x.ScenarioId)
.Select(groupOrderedByCreatedAt =>
       {
            var orderedGroup = groupOrderedByCreatedAt.OrderByDescending(x => x.CreatedAt);
                //Work with the orderedGroup
        });

像这样工作:

  1. 你按 scenarioId 对它们进行分组
  2. Select 每组
  3. 您按 createdAt
  4. 对每个组进行排序

然后你和有序组一起工作

_dbContext.Sessions.GroupBy(s => s.ScenarioId)
.ToDictionary(e => e.Key, e => e.OrderByDescending(o => o.CreatedAt).First())

在这种情况下,您将拥有一个以场景 ID 作为键、最后插入的项目作为值的字典。

我暂时用这个来解决,因为效率不是最大的问题。

_dbContext.Sessions.ToList().GroupBy(s => s.ScenarioId).ToList().
                Select(e => e.OrderByDescending(o => o.CreatedAt).First())
.Where(w => w.User.Equals(user) && w.Progress.Equals(Status.Finished.ToString())).ToList();

如果有人有更好的主意,我洗耳恭听!