If you don’t want to execute SQL directly calling DeleteObject in a loop is the best you can do.
context.Widgets.Where(w => w.WidgetId == widgetId)
.ToList().ForEach(context.Widgets.DeleteObject);
context.SaveChanges();
EntityFramework 6 has made this a bit easier with .RemoveRange()
.
db.People.RemoveRange(db.People.Where(x => x.State == "CA"));
db.SaveChanges();