2010-05-11 2 views
0

다음 쿼리에서 개체 목록을 얻었습니다. 중간에있는 항목을 삭제하는 방법, 2, 5 및 7 위치에서 항목을 삭제 하시겠습니까? 감사Linq, 쿼리 반환 중간에 항목을 삭제하는 방법?

  var archivedPwds = from archivedPwd in db.PasswordArchive 
           where archivedPwd.UserId == userId 
           orderby archivedPwd.DateChanged 
           select archivedPwd; 

편집 : 나는 L2E를 사용하여 데이터베이스에서 해당 항목을 삭제할하고

.

+0

삭제하면 어떻습니까? 데이터베이스에 삭제 명령을 실행하려고합니까? –

+0

예, 데이터베이스에서 삭제하고 싶습니다. – 5YrsLaterDBA

답변

3

IEnumerable 또는 IQueryable에서 항목을 "삭제"할 수 없습니다. 당신이 무엇 수 있습니다합니까 그들을 필터링하거나 필터링 결과에서 다른 컬렉션을 구축하고 있습니다. 인덱스에 의해

필터링은 여전히 ​​어디 의해 수행됩니다

var indexesToFilterOut = new[] { 2, 5, 7 }; 
var filtered = archivedPwds.Where((pwd, i) => !indexesToFilterOut.Contains(i)); 
-1

불행하게도, 당신의 유일한 옵션은 루프에서 archivedPwds을 반복하고 DB를 호출하여 즉, ("손으로"를 삭제하는 것입니다,이 경우. PasswordArchive.DeleteOnSubmit).

시도해 볼 수있는 것은 Select 메서드의 오버로드를 사용하여 항목의 색인을 얻는 것입니다. i. 이자형.

var archivedPwds = db.PasswordArchive 
        .Where(x => x.UserId == userId) 
        .OrderBy(x => x.DateChanged) 
        .Select((idx, item) => new { Index = idx, Item = itm }) 

으로 다시 작성한 다음 색인 필드를 사용하여 삭제할 항목을 필터링하십시오. 그러나, 나는 현실 세계에서 그것을 시도하지 않았고 linq2sql이 그것을 처리 할 수 ​​있는지 확실하지 않습니다.

var pwdsToDelete = archivedPwds.Where((_, i) => (i == 3 || i == 5 || i == 7)); 

을 그리고 엔티티 세트에서 모두 삭제 :

1

삭제 필터링 만 엔티티를 존의 방법을 사용할 수 있습니다 변경 사항을 저장

foreach (var pwd in pwdsToDelete) 
{ 
    db.PasswordArchive.DeleteObject(pwd); 
} 

잊지 마세요, too :

db.SaveChanges();