使用RemoveRange删除与内存对象匹配的项目

时间:2014-11-28 05:14:50

标签: c# linq entity-framework

数据库中包含1列(varchar)的表:" user1"," user2"," user3"。

内存列表:users = {" user1"," user2"}

有没有办法使用RemoveRange删除数据库中与内存列表项匹配的项?因此,在调用SaveChanges()之后,将从数据库中删除user1和user2。

db.Users.RemoveRange(....);
db.SaveChanges();

由于

3 个答案:

答案 0 :(得分:1)

您可以使用EntityFramework.Extensions项目。

List<User> usersToDelete = ...;
List<int> idsToDelete = usersToDelete.Select(x => x.Id).ToList();
db.Users.Delete(x => idsToDelete .Contains(x.Id));

但是,正如您所看到的,您必须在代码中定义密钥。可以创建和扩展从EF获取密钥......但是它使用System.Linq.Expressions命名空间很多工作,并且非常难。

答案 1 :(得分:1)

哎呀...完全忘记了实际答案。

你想&#34;附加&#34;上下文中的项目。

List<User> usersToDelete = ...;
foreach(var user in usersToDelete)
{
    db.Users.Attach(user);
    db.Entry(user).State = EntityState.Deleted; 
}
db.SaveChanged();

答案 2 :(得分:0)

使用ORM执行此操作的标准方法是从数据库中获取行(是的,我知道这很浪费),然后转身并将其传递回删除函数。

更好的方法是只进行原始SQL调用(不要忘记参数化)调用存储过程。


var t = users.Select(x => x.ColumnName); 
var t1 = db.TableName.Where(x => t.Contains(x.ColumnName)).ToList(); 
//then call RemoveRange() 
db.Ranges.RemoveRange(t1);