【问题标题】:Delete last N records, Entity Framework删除最后 N 条记录,实体框架
【发布时间】:2016-09-10 16:21:45
【问题描述】:

我使用以下代码删除实体框架中的最后 N 条记录:

取最后N个元素的扩展方法,取自here:

public static IEnumerable<T> TakeLast<T>(this IEnumerable<T> source, int N)
{
    return source.Skip(Math.Max(0, source.Count() - N));
}

删除最后N个元素:

MyDbContext.MyDbSet.RemoveRange(MyDbContext.MyDbSet.TakeLast(N));

有效吗?我不想重新发明轮子。也许我错过了一些现有的功能,比如 collection.RemoveLast (虽然我第一次努力找不到)?

【问题讨论】:

  • EF 提供Remove 根据要求删除的内容。我认为,TakeLast 将遍历数据库以获取最后一个元素,如果您有大量数据,这是有效的。跳过所有以前的数据对我来说听起来不太好。输入 TakeLast 的东西 DbSet.LastOrDefault 并删除该项目
  • @Eldho:就我而言,我不仅要删除最后一个元素,还要删除最后一个元素(其中几个)。
  • RemoveRange 可以,但是你如何获得最后的元素

标签: c# entity-framework entity-framework-6


【解决方案1】:

我会建议这样的事情

var lastUser = MyDbContext.Users.Select(g => g.Id).Max();

这将获取具有最大 id 的用户并删除该用户。这是解决方法,我不知道是否有任何简单的解决方法。我相信这比您问题中描述的查询更有效。你仍然只得到项目而不是列表

但只会得到最后一项

MyDbContext.Users.Remove(lastUser);
MyDbContext.SaveChanges();

【讨论】:

    【解决方案2】:

    你的方法没问题。 RemoveRange() 方法用于从数据库中删除多个项目。您用来获取最后 n 个项目的方法也可以。但是TakeLast() 只会根据它们添加到数据库中的顺序返回最后的项目。

    【讨论】:

      【解决方案3】:

      怎么样:

      var lastN = MyDbContext.MyDbSet
                             .OrderByDescending(g => g.Id)
                             .Take(N);
      
      MyDbContext.MyDbSet.RemoveRange(lastN);
      

      【讨论】:

      • 如果 Id 是 GUID 而不是整数怎么办?
      • 问题中均未指定。
      • OP 的扩展方法适用于任何情况。
      猜你喜欢
      • 1970-01-01
      • 2013-07-17
      • 1970-01-01
      • 1970-01-01
      • 2021-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多