Как я могу использовать операции над множествами для удаления объектов в коллекции объектов, которые соответствуют коллекции моделей представлений? - PullRequest
1 голос
/ 13 января 2012

Вот очень простой пример того, что я хочу сделать.Приведенный мною код кажется довольно многословным ... то есть циклически перебирает коллекцию и т. Д.

Я использую сетку Telerik MVC, которая отправляет обратно коллекцию удаленных, вставленных и обновленных моделей представления.Модели представлений похожи, но не полностью совпадают с сущностями.

Например ... У меня есть:

Order.Lines.Lines - это коллекция сущностей (свойство навигации), содержащая записи OrderDetail.В действии обновления моего контроллера с использованием списка имен DeletedLines извлекаются из данных POST.Я также сделал запрос к базе данных, и у меня есть сущность Order, включающая коллекцию Lines.

Теперь я хочу сказать ей, чтобы она удалила все OrderDetails в коллекции EntityCollection Lines.

То, как я это сделал, выглядит примерно так:

foreach (var line in DeletedLines) {
   db.DeleteObject(Order.Lines.Where(l => l.Key == line.Key).SingleOrDefault())
}

Я надеялся, что есть способ, которым я мог бы использовать .Interset (), чтобы получить коллекцию сущностей для удаления и передачичто для DeleteObject .. однако, DeleteObject, кажется, принимает только одну сущность, а не коллекцию.

Возможно, вышесказанное достаточно хорошо ... но казалось, что должен быть более простой способ.

Спасибо, BOb

Ответы [ 2 ]

2 голосов
/ 14 января 2012

Элементы в 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 выдаст исключение, когда вы передадите его null. Если это так, вам может быть даже лучше использовать Single, если вы уверены, что предмет находится там:

foreach (var line in DeletedLines) {
   db.DeleteObject(Order.Lines.Single(l => l.Key == line.Key))
}
0 голосов
/ 14 января 2012

Если вы не хотите повторно запрашивать базу данных и у вас уже есть значения PK таблицы сопоставления (или вы можете включить их в вызов клиента), вы можете использовать один из советов Алекса Джеймса для удаления без предварительного извлечения:

http://blogs.msdn.com/b/alexj/archive/2009/03/27/tip-9-deleting-an-object-without-retrieving-it.aspx

...