【问题标题】:Using GroupBy in LINQ to get last inserted rows [duplicate]在 LINQ 中使用 GroupBy 获取最后插入的行
【发布时间】:2020-06-18 09:17:15
【问题描述】:

我有一个简单的表,我想使用 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 列添加一个分组,以便它为每个 ScenarioId 返回最后插入的行,但在添加 GroupBy 语法时遇到问题。

public List<Session> FindLastFinishedByScenarios(IdentityUser user)

【问题讨论】:

  • 你没有具有类似于public ICollection&lt;Session&gt; Sessions { get; set; } 的集合导航属性的Scenario 实体吗?
  • 公共 DbSet 会话 { get;放; }

标签: c# sqlite linq ef-core-3.1


【解决方案1】:
_dbContext.Sessions.GroupBy(s => s.ScenarioId)
.ToDictionary(e => e.Key, e => e.OrderByDescending(o => o.CreatedAt).First())

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

【讨论】:

  • 我收到以下错误:不支持客户端 GroupBy。
  • 您使用的是 EF Core 吗?哪个版本?
  • 是 EF Core,Net Core 3.1
  • 它似乎不再可用了。您可以在“Sessions”之后使用“.AsEnumerable()”,但这意味着在应用分组之前将从数据库中获取所有记录,这不是很好(但过去似乎 EF 是这样处理分组的) :stackoverflow.com/questions/58138556/….
  • 所以我的回答对你没有帮助(除非你使用 .AsEnumerable() 或 .ToList(),否则你会得到你想要的结果,但效率低下)。
【解决方案2】:

应该这样做:

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

像这样工作:

  1. 您按scenarioId 对它们进行分组
  2. 选择它需要每个组
  3. 您按 createdAt 对每个组进行排序

然后你使用有序组

【讨论】:

  • 严重代码描述项目文件行抑制状态错误 CS0411 方法'Enumerable.Select(IEnumerable, Func)'的类型参数不能是从用法推断。尝试明确指定类型参数。它不喜欢语句的“选择”部分,不会编译。
【解决方案3】:

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

_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();

如果有人有更好的主意,我会全力以赴!

【讨论】:

    猜你喜欢
    • 2017-12-18
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    • 2019-11-21
    相关资源
    最近更新 更多