2016-05-14 44 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的擴展方法將適用於任何情況。 –