Как выполнить запрос и назначение с помощью Linq в одном операторе?

#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. Нужно было закончить с этим.