Возврат в начале цикла по выделенному совпадению/переключателю объединенияC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Возврат в начале цикла по выделенному совпадению/переключателю объединения

Сообщение Anonymous »

Я пишу API, который имеет конечные точки для обновления как одного элемента, так и нескольких элементов. В конечной точке для обновления нескольких элементов я хочу повторно использовать функцию для обновления одного элемента, просто перебирая все элементы для обновления. В настоящее время единственная функция обновления имеет три возможных возвращаемых значения (реализованных с помощью размеченного объединения с помощью OneOf):
  • Обновленный элемент
  • Экземпляр OneOf.NotFound на случай, если обновление ранее не существовало
  • Экземпляр OneOf.Error на случай, если возникла какая-либо другая проблема (например, ошибка проверки)
В конечной точке массового обновления я хотел бы вернуться раньше, если обновление элемента приведет к ошибке. Я попробовал использовать методы Match и Switch, предоставляемые OneOf, но не смог понять, как добиться описанного мной поведения. Вот моя текущая версия кода конечной точки:

Код: Выделить всё

routes.MapPut(RouteBases.ShoppingList, async (IEnumerable itemsToUpdate, MariaDbContext dbContext) =>
{
var storedItems = new List();
var failedItems = new List();
var state = (storedItems, failedItems);
foreach (var item in itemsToUpdate)
{
var updateResult = await UpdateItem(item, dbContext);
state = updateResult.Match(
storedItem => (storedItems.Append(storedItem), failedItems),
notFound => (storedItems, failedItems.Append(item)),
error => { return Results.BadRequest(); }
);
}

await dbContext.SaveChangesAsync();

return Results.Ok(new BulkUpdateResult(storedItems, failedItems));
});
Очевидно, что случай ошибки в моем совпадении не может скомпилироваться, поскольку его возвращаемый тип не может быть преобразован в ожидаемый тип, но он должен демонстрировать желаемое поведение. Как мне сделать это правильно, или мой подход в корне ошибочен?
P.S.: Пока писал это, я задавался вопросом, правильно ли вернуться раньше, только в случае ошибки. Это было бы немного несовместимо со случаем, когда элемент не может быть найден. Вероятно, мне следует либо изменить код, чтобы он не возвращался раньше, а также агрегировать ошибки, либо также возвращать раньше в случае результата обновления NotFound. Для этого API я мог бы также выбрать возврат агрегированных значений. Тем не менее, мне было бы очень интересно узнать, как решить эту проблему, поскольку в других подобных случаях может потребоваться досрочный возврат (например, «затратные» вызовы в цикле).

Подробнее здесь: https://stackoverflow.com/questions/791 ... tch-switch
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»