ID 목록에서 Entity Framework의 여러 행 업데이트


95

ID 목록을 가져와 관련 필드를 업데이트 할 수있는 엔터티 프레임 워크에 대한 쿼리를 만들려고합니다.

SQL의 예 :

UPDATE Friends
SET msgSentBy = '1234'
WHERE id IN (1, 2, 3, 4)

위의 내용을 엔티티 프레임 워크로 어떻게 변환합니까?


데이터베이스 플랫폼 오라클 MySQL은 .. 무엇입니까
— 지는

내 데이터베이스는 Microsoft SQL입니다
— Allencoded

이를 허용하는 오픈 소스 프로젝트에는 EntityFramework.Extended 및 E ntity Framework Extensions 두 가지가 있습니다 .
— Peter Kerr

이것에 대한 유일한 정답은 할 수 없다는 것입니다. 물론 Friend데이터베이스에서 일치하는 모든을 가져 와서 속성을 업데이트하고 msgSentBy변경 사항을 저장할 수 있습니다. 그러나 EF는 UPDATE각 개별 레코드에 대한 진술을 실행합니다. 이는 단일 문 대량 업데이트와 전혀 동일하지 않습니다. 말했듯이 대량 업데이트를 제공하는 타사 라이브러리를 찾으십시오.
— Gert Arnold

답변:


166

아래와 같이

var idList=new int[]{1, 2, 3, 4};
using (var db=new SomeDatabaseContext())
{
    var friends= db.Friends.Where(f=>idList.Contains(f.ID)).ToList();
    friends.ForEach(a=>a.msgSentBy='1234');
    db.SaveChanges();
}

최신 정보:

아래와 같이 여러 필드를 업데이트 할 수 있습니다.

friends.ForEach(a =>
                      {
                         a.property1 = value1;
                         a.property2 = value2;
                      });

방금 보낸 위의 foreach에서 두 개 이상의 필드를 업데이트 할 수 있습니까? 더 많은 일을 할 수 있는지 궁금하십니까? 또한 SubmitChanges가 더 이상 작동하지 않는 것처럼 보입니다. 최신 엔터티 프레임 워크를 사용하고 있습니다. 어쩌면 SaveChanges ()?
— Allencoded

10
ForEach는의 메서드 List이며 프로그래밍의 기능적인 방식이 아니기 때문에 일반적으로 사용하지 않는 것이 좋습니다. 평범한 사람처럼 foreach (운영자)를 사용 하십시오 .
— BlueRaja - 대니 Pflughoeft

55
이 솔루션을 사용하면 목록의 각 요소에 대해 하나의 업데이트 쿼리가 생성됩니다. EF가 질문에서와 같이 하나의 쿼리 만 수행하도록하는 방법이 있습니까? ( UPDATE SomeTable SET SomeField = SomeValue WHERE Id IN (...))
— RamNow 2010 년

19
이것은 데이터베이스 관점에서이 문제를 해결하는 매우 비효율적 인 방법입니다. 이것은 Friends 테이블의 모든 행을 포함하는 큰 select 문을 발행 할뿐만 아니라 업데이트되는 모든 레코드에 대해 별도의 UPDATE 명령을 발행합니다. 따라서 하나의 명령을 실행하는 대신 잠재적으로 많은 명령을 실행하고 데이터베이스에서 데이터를 스트리밍합니다.
— d512

1
@ShekharPankaj, 기본적으로 "UPDATE Friends SET msgSentBy = '1234'WHERE ID IN (1, 2, 3, 4)"와 같은 SQL 명령을 실행합니다. 나는 EF가 직접 지원한다고 생각하지 않습니다. 이에 대한 타사 솔루션이 있다고 생각 하지만 ( stackoverflow.com/questions/12751258/batch-update-delete-ef5 ) 사용하지 않았습니다. 다른 옵션은 EF 대신 원시 ADO.NET을 사용하는 것입니다.
— d512

-1
var idList=new int[]{1, 2, 3, 4};
var friendsToUpdate = await Context.Friends.Where(f => 
    idList.Contains(f.Id).ToListAsync();

foreach(var item in previousEReceipts)
{
  item.msgSentBy = "1234";
}

foreach를 사용하여 조건을 충족하는 각 요소를 업데이트 할 수 있습니다.

다음은보다 일반적인 방법의 예입니다.

var itemsToUpdate = await Context.friends.Where(f => f.Id == <someCondition>).ToListAsync();

foreach(var item in itemsToUpdate)
{
   item.property = updatedValue;
}
Context.SaveChanges()

일반적으로 await for db 쿼리와 함께 비동기 메서드를 가장 많이 사용합니다.


이것이 기존 답변에 어떻게 추가되는지 모르겠습니다. 기본적으로 반복합니다.
— Gert Arnold
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.