Atualizar várias linhas no Entity Framework de uma lista de ids

93

Estou tentando criar uma consulta para estrutura de entidade que me permitirá pegar uma lista de ids e atualizar um campo associado a eles.

Exemplo em SQL:

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

Como faço para converter o acima em estrutura de entidade?

allencoded
fonte
Qual é a sua plataforma de banco de dados Oracle mysql ..
zee
Meu banco de dados é Microsoft SQL
codificado em
Existem dois projetos de código aberto que permitem isso: EntityFramework.Extended e E ntity Framework Extensions .
Peter Kerr

Respostas:

164

algo como abaixo

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();
}

ATUALIZAR:

você pode atualizar vários campos como abaixo

friends.ForEach(a =>
                      {
                         a.property1 = value1;
                         a.property2 = value2;
                      });
Damith
fonte
posso atualizar mais de um campo no foreach acima que você acabou de enviar, que é exatamente o que eu pedi. apenas curioso se você poderia fazer mais? Também não parece que o SubmitChanges funcione mais. Estou usando a estrutura de entidade mais recente. Talvez SaveChanges ()?
codificado em
10
ForEaché um método ativado Liste geralmente não é recomendado usar porque não é uma forma muito funcional de programação. Basta usar foreach (a operadora) como uma pessoa normal.
BlueRaja - Danny Pflughoeft
53
O uso dessa solução gera uma consulta de atualização para cada elemento da lista. Existe uma maneira de fazer o EF fazer apenas uma consulta, como na pergunta? ( UPDATE SomeTable SET SomeField = SomeValue WHERE Id IN (...))
RamNow,
19
Esteja ciente de que essa é uma maneira bastante ineficiente de fazer isso a partir de uma perspectiva de banco de dados. Isso não apenas emite uma grande instrução select envolvendo todas as linhas da tabela Friends, mas também emite um comando UPDATE separado para cada registro que é atualizado. Portanto, em vez de emitir um comando, você emite potencialmente muitos comandos, além de transmitir um monte de dados de seu banco de dados.
d512
1
@ShekharPankaj, basicamente o que você quer fazer é emitir um comando SQL como "UPDATE Friends SET msgSentBy = '1234' WHERE ID IN (1, 2, 3, 4)". Não acho que a EF tenha apoio direto para fazer isso. Acredito que existam algumas soluções de terceiros para isso ( stackoverflow.com/questions/12751258/batch-update-delete-ef5 ), mas não as usei. A outra opção é usar ADO.NET bruto em vez de EF.
d512