#c# #linq #entity-framework-6
Вопрос:
Я собираю таблицу продуктов от корпорации, чтобы убедиться, что они скорректировали любые цены со своей стороны. Поэтому после предварительной загрузки списка проверки цен с различиями я хочу найти строку в своей модели базы данных, в которой мое имя (продукт) совпадает с их именем, а затем обновить MyPrice по их цене за один раз. Не ошибается, просто, похоже, не обновляет мою таблицу элементов. Правильно ли я это делаю?
DbModels db = new DbModels(); foreach (var row in PriceCheckList) { db.Items.FirstOrDefault(i =gt; i.MyName == row.TheirName).MyPrice = row.TheirPrice; } db.SaveChanges();
ТИА
Комментарии:
1. Вообще не отвечая на ваш вопрос, просто примечание: использование
FirstOrDefault
означает, что вы ожидаете случая, когда никакие элементы не соответствуют заданному выражению, и в этом случае метод вернетсяnull
. Но, несмотря на этот факт, вы пытаетесь установитьMyPrice
его свойство, рискуяNullReferenceException
каждый раз, когда выражения не совпадают ни с какими элементами.2. Ваша конструкция необычна, но я не вижу причин, по которым она не должна работать. Вы пробовали какую-нибудь отладку? (LINQ предназначен для запросов, возможно, было бы более идиоматично иметь
var matchingItem = db.Items.FirstOrDefault(...); if (matchingItem != null) matchingItem.MyPrice = row.TheirPrice;
3. Я бы извлек всю коллекцию в соответствии с фильтром один раз (одна операция ввода-вывода), а затем обновил бы ее в течение каждого. Хотя, кэш может быть использован. Но все равно.
4. Я просто бросил использовать старые добрые инструкции SQL. Нужно было закончить с этим.