Sto cercando di eliminare più righe da una tabella.
Nel normale SQL Server, questo sarebbe semplice come questo:
DELETE FROM Table
WHERE
Table.Column = 'SomeRandomValue'
AND Table.Column2 = 'AnotherRandomValue'
In Entity Framework 6, hanno introdotto il metodo RemoveRange () .
Tuttavia, quando lo uso, anziché eliminare le righe utilizzando le clausole where fornite, Entity Framework esegue una query sul database per ottenere tutte le righe corrispondenti alle clausole where ed eliminarle una ad una utilizzando le loro chiavi primarie.
È questa l'attuale limitazione di EntityFramework? O sto usando RemoveRange()
sbagliato?
Di seguito è come sto usando RemoveRange()
:
db.Tables.RemoveRange(
db.Tables
.Where(_ => _.Column == 'SomeRandomValue'
&& _.Column2 == 'AnotherRandomValue')
);
Penso che abbiamo raggiunto qui una limitazione di EF. A volte devi solo usare ExecuteSqlCommand per rimanere performante.
Quello che stai cercando è una libreria di eliminazione batch che cancella più record in un database da una query LINQ senza caricare entità.
Esistono librerie multiple che supportano questa funzione.
È possibile trovare l'elenco qui: Entity Framework Batch Delete Library
Disclaimer : sono il proprietario del progetto Entity Framework Plus
// using Z.EntityFramework.Plus; // Don't forget to include this.
// DELETE directly in SQL (without loading entities)
db.Tables.Where(_ => _.Column == 'SomeRandomValue'
&& _.Column2 == 'AnotherRandomValue')
.Delete();
// DELETE using a BatchSize
db.Tables.Where(_ => _.Column == 'SomeRandomValue'
&& _.Column2 == 'AnotherRandomValue')
.Delete(x => x.BatchSize = 1000);
Wiki: EF + Batch Delete