2014-11-28 2 views
1

1 열 (varchar)이있는 데이터베이스의 테이블 : "user1", "user2", "user3".RemoveRange를 사용하여 메모리 개체와 일치하는 항목 제거

메모리리스트 : 사용자 = { "USER1", "사용자 2"}

는 메모리 목록의 항목과 일치하는 데이터베이스 항목을 제거 removeRange를를 사용하는 어떤 방법이 있습니까? 따라서 SaveChanges()를 호출 한 후 user1과 user2가 데이터베이스에서 삭제됩니다.

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

감사

ORM이 작업을 수행하는 표준 방법은 데이터베이스에서 행을 인출하는 것입니다

답변

0

은 다음 돌아서 삭제 기능을 다시 통과 (참, 나는 그것이 낭비 알고있다).

더 좋은 방법은 저장 프로 시저를 호출하는 원시 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); 
+0

제안 해 주셔서 감사합니다. 메모리 목록과 일치하는 데이터베이스에서 데이터를 가져올 수 있습니까? – qnguyen

+1

죄송합니다. VS에서 Contains()에 잘못된 인수가 표시되어 코드가 작동하지 않습니다. 이 링크를 발견했습니다. 일치 항목을 얻는 데 도움이됩니다. http://stackoverflow.com/questions/6547472/join-between-in-memory-collection-and-entityframework?rq=1 'var t = users.Select (x => x.ColumnName); var t1 = db.TableName.Where (x => t.Contains (x.ColumnName)). ToList(); // RemoveRange()를 호출합니다. db.Ranges.RemoveRange (t1); ' – qnguyen

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

정말 ... 실제 답변을 완전히 잊어 버렸습니다.

컨텍스트에 항목을 "첨부"하고 싶습니다.

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

아니요, 목록은 데이터베이스가 아닌 메모리 개체이므로 동일한 기본 키 값으로 인해 실패하므로 첨부를 사용할 수 없습니다. – qnguyen

+0

@qnguyen 해 보셨습니까? DbContext를 재사용하지 말고 새로운 DbContext를 새로 작성하십시오. – Aron

+0

시도해 본 경우 어떤 오류가 발생 했습니까? – Aron