So che questo è possibile in LINQ-to-SQL e ho visto frammenti che mi hanno portato a credere che sia possibile in EF. Esiste un'estensione là fuori che può fare qualcosa di simile:Codice EF Elimina prima lotto da IQueryable <T>?
var peopleQuery = Context.People.Where(p => p.Name == "Jim");
peopleQuery.DeleteBatch();
Dove DeleteBatch
solo raccoglie parte il peopleQuery e crea una singola istruzione SQL per eliminare tutti i record appropriati, quindi esegue la query direttamente invece di marcare tutti coloro entità per la cancellazione e facendole fare una per una. Ho pensato di aver trovato qualcosa del genere nel codice qui sotto, ma fallisce immediatamente perché l'istanza non può essere castata in ObjectSet. Qualcuno sa come risolvere il problema prima di lavorare con EF Code? O sai da qualche parte che ha un esempio di questo fatto?
public static IQueryable<T> DeleteBatch<T>(this IQueryable<T> instance) where T : class
{
ObjectSet<T> query = instance as ObjectSet<T>;
ObjectContext context = query.Context;
string sqlClause = GetClause<T>(instance);
context.ExecuteStoreCommand("DELETE {0}", sqlClause);
return instance;
}
public static string GetClause<T>(this IQueryable<T> clause) where T : class
{
string snippet = "FROM [dbo].[";
string sql = ((ObjectQuery<T>)clause).ToTraceString();
string sqlFirstPart = sql.Substring(sql.IndexOf(snippet));
sqlFirstPart = sqlFirstPart.Replace("AS [Extent1]", "");
sqlFirstPart = sqlFirstPart.Replace("[Extent1].", "");
return sqlFirstPart;
}
Sono d'accordo con te al 100% su tutti i tuoi punti, ma è un rischio accettabile nel nostro progetto considerando il serio colpo alla performance preso nel modo ufficiale. Grazie per la risposta! – Ocelot20