Как я могу использовать операции над множествами для удаления объектов в коллекции объектов, которые соответствуют коллекции моделей представлений?
Вот очень простой пример того, что я хочу сделать. Код, который я придумал, кажется довольно многословным... то есть циклически просматривая коллекцию и т. Д.
Я использую сетку Telerik MVC, которая отправляет обратно коллекцию удаленных, вставленных и обновленных ViewModels. Модели представлений похожи, но не полностью совпадают с сущностями.
Например... у меня есть:
Order.Lines. Lines - это коллекция сущностей (свойство навигации), содержащая записи OrderDetail. В действии обновления моего контроллера с использованием списка имен DeletedLines извлекаются из данных POST. Я также запросил базу данных и получил сущность Order, включая коллекцию Lines.
Теперь я хочу сказать ему, чтобы он удалил все OrderDetails из коллекции Lines EntityCollection.
То, как я это сделал, выглядит примерно так:
foreach (var line in DeletedLines) {
db.DeleteObject(Order.Lines.Where(l => l.Key == line.Key).SingleOrDefault())
}
Я надеялся, что есть способ, которым я мог бы использовать.Interset(), чтобы получить коллекцию сущностей для удаления и передать ее в DeleteObject. Однако, DeleteObject, кажется, принимает только одну сущность, а не коллекцию.
Возможно, вышесказанное достаточно хорошо... но казалось, что должен быть более простой метод.
Спасибо, Боб
2 ответа
Элементы в DeletedLines прикреплены к контексту? Если так, то как насчет этого?
foreach (var line in DeletedLines) db.DeleteObject(line);
Ответ на комментарий № 1
Хорошо, теперь я вижу. Вы можете сделать свой код немного короче, но не намного:
foreach (var line in DeletedLines) {
db.DeleteObject(Order.Lines.SingleOrDefault(l => l.Key == line.Key))
}
Я не уверен, что DeleteObject выдаст исключение, когда вы передадите ему ноль. Если это произойдет, вам может быть даже лучше использовать Single, если вы уверены, что предмет находится там:
foreach (var line in DeletedLines) {
db.DeleteObject(Order.Lines.Single(l => l.Key == line.Key))
}
Если вы не хотите повторно запрашивать базу данных и у вас уже есть значения PK таблицы сопоставления (или можете включить их в вызов клиента), вы можете использовать один из советов Алекса Джеймса для удаления без предварительного извлечения:
http://blogs.msdn.com/b/alexj/archive/2009/03/27/tip-9-deleting-an-object-without-retrieving-it.aspx