2016-05-14 43 views
4

我用下面的代码实体框架中删除最后N个记录:删除最后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这样的现有功能(虽然我第一次尝试找不到一个功能)?

+0

EF提供'Remove'如何删除相对于要求。 我想,'TakeLast'将通过数据库遍历来获得最后一个元素,这是有效的,如果你有大量的数据。跳过所有以前的数据对我来说听起来不太好。在我来说,我想删除不仅最后一个元素,但最后的元素(几个): 你在哪里得到'DbSet.LastOrDefault'和删除元素 – Eldho

+0

@Eldho 泰东西'TakeLast'。 – Bad

+0

'RemoveRange'是好的,但你如何获得最后的元素 – Eldho

回答

1

你的方法是确定的。 RemoveRange()方法用于从数据库中删除多个项目。你用来获得最后n个项目的方法也可以。然而TakeLast()只会返回基于他们被添加到数据库的顺序上最后一个项目。

0

我建议这样的事情

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

这将得到最大ID的用户和删除用户。这是解决方法我不知道是否有任何简单的解决方法。我相信这比您的问题中描述的查询更有效。不过你只有项目而不是列表

,但只会得到最后一个项目

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

如何:

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

MyDbContext.MyDbSet.RemoveRange(lastN); 
+0

如果什么标识是GUID,而不是一个整数? –

+0

问题中没有指定。 – aligray

+0

OP的扩展方法将适用于任何情况。 –