#c# #asp.net-mvc #asp.net-core #entity-framework-core #asp.net-core-mvc
#c# #asp.net-mvc #asp.net-core #entity-framework-core #asp.net-core-mvc
Вопрос:
Я не понимаю, почему происходит эта ошибка. моя программа выглядит примерно так: -У меня есть коллекция многих данных в базе данных, а также указан тип данных сеанса. где идентификатор данных «сеанса» похож на идентификатор данных моей базы данных, там я изменяю количество, используя функциональность. но когда последний подсчет моего цикла изменил мое свойство количества (я отладил это), я обнаружил эту ошибку.
Вот мой код :
public async Task<IActionResult> Checkout(Order11 anOrder)
{
List<Shop> shop = HttpContext.Session.Get<List<Shop>>("shop");
for (int i = 0; i < shop.Count; i )
{
// var r = shop[i].Id;
if (_db.Shop.Any(x => x.Id == shop[i].Id))
{
var t = _db.Shop.Where(x => x.Id == shop[i].Id).ToList();
if (t[i].Quantity > 0)
{
t[i].Quantity = (t[i].Quantity - shop[i].Quantity)
}
_db.SaveChanges();
}
}
// other code
}
Вот мой вывод:
Я не понимаю, каково решение этой проблемы. Я новичок. пожалуйста, помогите.
Ответ №1:
Рассмотрим, что здесь происходит:
var t = _db.Shop.Where(x => x.Id == shop[i].Id).ToList();
Предполагая, что ваши идентификаторы уникальны, это приведет только к одному элементу, но вернет его как единственный элемент списка.
Таким образом, вы не хотите индексировать в t
with t[i]
. Вы просто хотите t[0]
получить единственный элемент.
Однако все это можно сделать еще аккуратнее:
for (int i = 0; i < shop.Count; i )
{
// Single() returns null for no match, the object for a single match
// and throws an exception for multiple matches
var t = _db.Shop.Single(x => x.Id == shop[i].Id);
// ?. first checks if t is null, and only then looks at Quantity
// if t is not null (i.e. Single() has returned a match)
if (t?.Quantity > 0)
{
t.Quantity = (t.Quantity - shop[i].Quantity);
_db.SaveChanges();
}
}
(Отдельная проблема, но я не уверен, что вам нужно _db.SaveChanges()
вызывать внутри цикла. Почему бы просто не вызвать его один раз в конце?
Комментарии:
1. На самом деле, еще одна очистка будет
t.Quantity -= shop[i].Quantity;
Ответ №2:
t
это отфильтрованный список магазина, поэтому его количество меньше или равно shop.Count
, вы не можете использовать i
в качестве индекса для t
.
Вы можете изменить свой код, как показано ниже.
for (int i = 0; i < shop.Count; i )
{
if (_db.Shop.Any(x => x.Id == shop[i].Id))
{
var t = _db.Shop.Where(x => x.Id == shop[i].Id).ToList();
foreach (var x in t)
{
if (x.Quantity > 0)
{
x.Quantity = (x.Quantity - shop[i].Quantity);
}
}
_db.SaveChanges();
}
}