在 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
});
像这样工作:
- 你按 scenarioId 对它们进行分组
- Select 每组
- 您按 createdAt
对每个组进行排序
然后你和有序组一起工作
_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();
如果有人有更好的主意,我洗耳恭听!
我有一个简单的 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
});
像这样工作:
- 你按 scenarioId 对它们进行分组
- Select 每组
- 您按 createdAt 对每个组进行排序
然后你和有序组一起工作
_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();
如果有人有更好的主意,我洗耳恭听!