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.