.NET APIs Part 5 – All the CRUD APIs

In the previous posting we saw how to create an API to get all the cars in our database. In this posting we’ll look at the remaining CRUD (Create Review Update Delete) operations.

As you may remember, we created a controller named CarController. ASP.NET will strip off the word Controller, leaving us with Car, which we will use to access the endpoints of our API.

An endpoint is just a URL that takes us to the operation we want.

We looked at GetAll, let’s take a look at Get. In this case, we have an id for the car we want, but we want all the details of that car. Simple!

First we need a method in our controller:

[HttpGet("{id}")]
public async Task<ActionResult<Car>> Get(int id)
{
   var car = await _carRepository.Get(id);
   if (car == null)
   {
      return NotFound();
   }
   return car;
}


Notice that next to the HttpGet attribute we indicate that the endpoint will take the id of the car we want

[HttpGet("{id}")]

This means we need to modify the URL to access the endpoint by adding the actual id of the desired record.

The first thing we do is call the repository, passing in the id.

public async Task<Car?> Get(int id)
{
   var query = "select * from car where id=@id";
   using var db = databaseConnectionFactory.GetConnection();
   return await db.QuerySingleOrDefaultAsync<Car>(query, new {id});
}

In the Get method of the repo we create our query, get our connection and execute the query returning the value we retrieved (if any). This is very close to what we did previously.

Back in the controller, we check to ensure that we received a Car. If not, we return NotFound which is a shorthand way of returning a 404 message. Otherwise we return the Car as a Json object. You can see this in Postman:

We’ll issue a Get command passing in the URL, ending with the id of the car we want (in this case 4)

 

 

 

Notice that we get back a 200, indicating success. In the body of the returned Json we get back all the details of the Car. (If you decide to use DTOs you can get whatever subset of the information makes sense):

{
    “id”: 4,
    “name”: “subaru impreza”,
    “mpg”: “16”,
    “cylinders”: “8”,
    “displacement”: “304”,
    “horsepower”: “150”,
    “weight”: “3433”,
    “acceleration”: “12”,
    “model_year”: “22”,
    “origin”: “usa”,
    “is_deleted”: “0”
}

Post

Adding a Car to the database is quite similar. We need a method in the controller and one in the repo. Here is the controller method:

[HttpPost]
public async Task<ActionResult<Car>> Post([FromBody] Car car)
{
   try
   {
      car = await _carService.Insert(car);
   }
   catch (Exception e)
   {
      return BadRequest(e); 
   }

   return CreatedAtAction(nameof(Get), new { id = car.Id }, car);
}

Look at the attribute in the parameter ([FromBody]. This indicates to the API that the data needed to insert this Car will be in the body of the call. The alternative is FromQuery. You can, in fact, use both in one call.

Note: CreatedAction causes a return code of 201, which is what we want. Here’s the body we’ll insert:

{
        “name”: “chevrolet chevelle malibu”,
        “mpg”: “18”,
        “cylinders”: “8”,
        “displacement”: “307”,
        “horsepower”: “130”,
        “weight”: “3504”,
        “acceleration”: “12”,
        “model_year”: “70”,
        “origin”: “usa”,
        “is_deleted”: “0”
    }

When we click Send this data is sent to the API which returns 201 (created) and in the body of the returned data we see the new id assigned to this car

{
    “id”: 409,
    “name”: “chevrolet chevelle malibu”,
    “mpg”: “18”,
    “cylinders”: “8”,
    “displacement”: “307”,
    “horsepower”: “130”,
    “weight”: “3504”,
    “acceleration”: “12”,
    “model_year”: “70”,
    “origin”: “usa”,
    “is_deleted”: “0”
}

Service Class

Notice that this time, instead of calling the Repo directly, the method in the controller calls into a service class. A service class is a great way to get the logic out of the controller, where it does not belong, without putting it into the repo, where it also does not belong.

Here’s the top of the CarService

public class CarService : ICarService
{
   private readonly ICarRepository _carRepository;

   public CarService(ICarRepository carRepository)
   {
      _carRepository = carRepository;
   }

   public async Task<Car> Insert(Car car)
   {
      var newId = await _carRepository.UpsertAsync(car);
      if (newId > 0)
      {
         car.Id = newId;
      }
      else
      {
         throw new Exception("Failed to insert car");
      }
   return car;
   }

All the logic associated with this insert (e.g., making sure we get back a legitimate id from the repository, etc.) is encapsulated in the service.

This leaves the repository free to just talk to the database,

public async Task<int> UpsertAsync(Car car)
{
using var db = databaseConnectionFactory.GetConnection();
var sql = @"
DECLARE @InsertedRows AS TABLE (Id int);
MERGE INTO Car AS target
USING (SELECT @Id AS Id, @Name AS Name, @Model_Year AS Model_Year, 
@Is_Deleted AS Is_Deleted, @Origin AS origin ) AS source 
ON target.Id = source.Id
WHEN MATCHED THEN 
UPDATE SET 
Name = source.Name, 
Model_Year = source.Model_Year, 
Is_Deleted = source.Is_Deleted,
Origin = source.Origin
WHEN NOT MATCHED THEN
INSERT (Name, Model_Year, Is_Deleted, Origin)
VALUES (source.Name, source.Model_Year, 
source.Is_Deleted, source.Origin)
OUTPUT inserted.Id INTO @InsertedRows
;

SELECT Id FROM @InsertedRows;
";

var newId = await db.QuerySingleOrDefaultAsync<int>(sql, car);
return newId == 0 ? car.Id : newId;
}

Rather than having an insert and an update method, we combine that logic into this upsert method. This is a common idiom for database manipulation.

Note: to make this work, be sure to fill in all the fields for a car (or at least as many as you want to have in the Database.

Delete

As noted earlier, we will implement a soft delete; that is, rather than actually removing the data from the database, we’ll just set the is_deleted column to true. This allows us to reverse the action, and make the row not-deleted by simply changing that value to false.

[HttpDelete(“{id}”)]
public async Task<IActionResult> Delete(int id)
{
try
{
await _carService.Delete(id);
}
catch (Exception e)
{
return BadRequest(e);
}
return NoContent();
}

As you would expect, the endpoint takes an id (the id of the car we want to delete). The controller then hands that off to the service, which calls the repository which, in turn, marks that id as deleted:

public async Task<int> DeleteAsync(int id)
{
   using var db = databaseConnectionFactory.GetConnection();
   var query = "UPDATE car SET Is_Deleted = 1 WHERE Id = @Id";
   return await db.ExecuteAsync(query, new { Id = id });
}

If you are comfortable with SQL none of this will be very surprising. The key walkaway is:

Summary

In this post we saw that endpoints are just URLs with (potentially) data in the body of the request. The controller handles the URL and in our case passes the id or other data to the service. The service handles the (business) logic and then delegates talking to the database to the repository.

Book

This posting is excerpted from my forthcoming book Building APIs with .NET and C# to be released next year by Packt.

Unknown's avatar

About Jesse Liberty

** Note ** Jesse is currently looking for a new position. You can learn more about him at https://jesseliberty.bio Thank you. Jesse Liberty has three decades of experience writing and delivering software projects and is the author of 2 dozen books and a couple dozen online courses. His latest book, Building APIs with .NET, is now available wherever you buy your books. Liberty was a Team Lead and Senior Software Engineer for various corporations, a Senior Technical Evangelist for Microsoft, a Distinguished Software Engineer for AT&T, a VP for Information Services for Citibank and a Software Architect for PBS. He is a 13 year Microsoft MVP.
This entry was posted in Essentials. Bookmark the permalink.

2,765 Responses to .NET APIs Part 5 – All the CRUD APIs

  1. GichardAmomi's avatar GichardAmomi says:

    Thanks , I’ve just been searching for info about this subject for a while and yours is the greatest I’ve found out so far. However, what concerning the bottom line? Are you certain in regards to the supply?
    казино banda

  2. ShanepiliA's avatar ShanepiliA says:

    you are in reality a just right webmaster. The website loading speed is incredible. It seems that you’re doing any distinctive trick. Also, The contents are masterpiece. you’ve done a excellent job on this topic!
    бонус Banda Casino

  3. Jameswarse's avatar Jameswarse says:

    alt текст для изображений
    https://razrabotkaiseo.ru

  4. Fobertnap's avatar Fobertnap says:

    Its like you read my mind! You seem to know so much about this, like you wrote the book in it or something. I think that you could do with some pics to drive the message home a little bit, but instead of that, this is wonderful blog. An excellent read. I will definitely be back.
    зеркало либет казино

  5. LhanepiliA's avatar LhanepiliA says:

    Hello all, here every one is sharing these kinds of knowledge, therefore it’s pleasant to read this blog, and I used to go to see this web site every day.
    официальный сайт банда казино

  6. Stephenviaps's avatar Stephenviaps says:

    Hi colleagues, nice article and pleasant urging commented here, I am genuinely enjoying by these.
    официальный сайт lee bet

  7. fixrig's avatar fixrig says:

    Зацепил материал про Просто и понятно о валютных курсах.

    Ссылка ниже:

    https://exchangetrade.ru

  8. Josephcleaf's avatar Josephcleaf says:

    Клиника сочетает профессиональную медицинскую помощь с внимательным отношением к каждому пациенту. Все процедуры проводятся только с использованием сертифицированных препаратов, а медперсонал проходит регулярное обучение и аттестацию. Центр оснащён современным оборудованием, позволяющим контролировать показатели организма в реальном времени. Врачи работают круглосуточно, поэтому помощь можно получить в любое время дня и ночи.
    Ознакомиться с деталями – вывод из запоя цена

  9. serviceMuh's avatar serviceMuh says:

    Обратитесь в сервис-центр для решения проблем с вашей поломкой

  10. serviceMuh's avatar serviceMuh says:

    Обратитесь в сц для решения проблем с вашей поломкой

  11. serviceMuh's avatar serviceMuh says:

    Обратитесь в сервис для решения проблем с вашей поломкой

  12. GichardAmomi's avatar GichardAmomi says:

    Hello to every body, it’s my first pay a quick visit of this web site; this blog carries awesome and actually good material in support of readers.
    https://drvieiraplastica.com.br/melbet-bukmekerskaya-kontora-2025-obzor/

  13. hgh dosage iu bodybuilding

    References:

    hgh 4 iu (travelersqa.com)

  14. LewisGor's avatar LewisGor says:

    Greate pieces. Keep posting such kind of info on your page. Im really impressed by your site.
    Hey there, You have performed a fantastic job. I will certainly digg it and in my opinion suggest to my friends. I am confident they’ll be benefited from this web site.
    https://rthurjay.webversatility.com/2025/10/20/melbet-bonus-na-depozit-2025/

  15. Clydetuh's avatar Clydetuh says:

    В этом информативном тексте представлены захватывающие события и факты, которые заставят вас задуматься. Мы обращаем внимание на важные моменты, которые часто остаются незамеченными, и предлагаем новые перспективы на привычные вещи. Подготовьтесь к тому, чтобы быть поглощенным увлекательными рассказами!
    Информация доступна здесь – https://aipkiwil6.org/2023/06/29/posting-pertama

  16. serviceMuh's avatar serviceMuh says:

    Обратитесь в сервисный центр для решения проблем с вашей поломкой

  17. DavidOxymn's avatar DavidOxymn says:

    Что делает врач
    Ознакомиться с деталями – vyvod-iz-zapoya-noginsk

  18. KevinCip's avatar KevinCip says:

    Выездная бригада прибывает с необходимым оборудованием. Инфузионная терапия длится 60–120 минут; по ходу процедуры контролируются давление, пульс, дыхание и субъективное самочувствие, при необходимости схема корректируется (темп капания, смена растворов, добавление противорвотных или седативных средств). Чаще всего уже к концу первой инфузии снижается тошнота, уходит дрожь и «внутренняя дрожь», нормализуется сон. Врач оставляет пошаговый план на 24–72 часа: питьевой режим, щадящее питание (дробно, без жирного и острого), режим сна, рекомендации по витаминам и гепатопротекции. Если в процессе выявляются тревожные признаки (нестабильная гемодинамика, выраженная аритмия, спутанность сознания), будет предложен перевод в стационар.
    Получить дополнительную информацию – http://vyvod-iz-zapoya-reutov7.ru/vyvod-iz-zapoya-cena-v-reutove/

  19. Michaelsmags's avatar Michaelsmags says:

    Как работает
    Детальнее – кодирование от алкоголизма цены

  20. serviceMuh's avatar serviceMuh says:

    Обратитесь в сервисный центр для решения проблем с вашей поломкой

  21. Sustainable's avatar Sustainable says:

    Cabinet IQ
    15030 N Tatum Blvd #150, Phoenix,
    AZ 85032, United Ꮪtates
    (480) 424-4866
    Sustainable

  22. Stanleyatons's avatar Stanleyatons says:

    Статья содержит практические рекомендации и полезные советы, которые можно легко применить в повседневной жизни. Мы делаем акцент на реальных примерах и проверенных методиках, которые способствуют личностному развитию и улучшению качества жизни.
    Изучить вопрос глубже – https://faktualid.com/lifestyle/muh-farhan-zuhdi/cara-menghilangkan-lem-korea-di-tangan

  23. Stanleyatons's avatar Stanleyatons says:

    Статья содержит практические рекомендации и полезные советы, которые можно легко применить в повседневной жизни. Мы делаем акцент на реальных примерах и проверенных методиках, которые способствуют личностному развитию и улучшению качества жизни.
    Перейти к полной версии – https://thefabcode.com/top-10-seo-agencies-for-wordpress

  24. serviceMuh's avatar serviceMuh says:

    Обратитесь в сц для решения проблем с вашей поломкой

  25. Georgeroake's avatar Georgeroake says:

    Этот информационный обзор станет отличным путеводителем по актуальным темам, объединяющим важные факты и мнения экспертов. Мы исследуем ключевые идеи и представляем их в доступной форме для более глубокого понимания. Читайте, чтобы оставаться в курсе событий!
    Ознакомиться с деталями – https://www.gothaibefree.com/thaicuisine

  26. Advokat_grSn's avatar Advokat_grSn says:

    адвокат по уголовным делам
    Услуги защитника по уголовным делам в Москве: как добиться успешной защиты клиента и получить положительные отзывы на различные вопросыАдвокат по уголовным делам в Москве
    Спрос на услуги адвоката по уголовным делам в Москве высок среди тех, кто сталкивается с различными обвинениями. Независимо от сложности дела, важно иметь квалифицированного защитника, который поможет законно и эффективно защищать ваши интересы в суде.
    Зачем обращаться к адвокату?

    Опытный адвокат знает все нюансы уголовного процесса и успешно ведет дела в суде.
    Профессионал окажет помощь в достижении положительного исхода и снизит негативные последствия.
    Клиенты могут рассчитывать на полноценные консультации по всем аспектам дела.

    Какие задачи выполняет адвокат?

    Деятельность адвоката по уголовным делам охватывает несколько основных стадий:

    Начальная встреча, на которой юрист исследует особенности дела и оценивает вероятность успеха.
    Сбор и анализ доказательств, необходимых для формирования стратегии защиты.
    Составление материалов для суда и участие в судебных слушаниях.
    Защита интересов клиента на всех стадиях уголовного разбирательства.

    Почему клиенты выбирают нас
    Наши клиенты подчеркивают нашу высокую квалификацию и профессионализм. Мы стремимся к тому, чтобы каждый из них чувствовал себя защищенным и уверенным в своих силах. Наша команда обладает большим опытом в ведении уголовных дел, что позволяет нам добиваться успешных решений в самых сложных случаях.

    Как выбрать адвоката?
    Когда выбираете адвоката по уголовным делам в Москве, учитывайте:

    Рекомендации от бывших клиентов;
    Опыт работы в вашей конкретной области;
    Способность предоставить профессиональные консультации;
    Индивидуальный подход к каждому делу.

    Не забывайте, что чем раньше вы начнете сотрудничество с профессионалом, тем выше вероятность достижения положительного результата. При возникновении вопросов вы можете смело обращаться к нам.

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

  27. ShanepiliA's avatar ShanepiliA says:

    Thank you for the auspicious writeup. It in truth used to be a entertainment account it. Glance complex to more added agreeable from you! By the way, how could we communicate?
    sklo

  28. GeorgeGem's avatar GeorgeGem says:

    Если на осмотре выявляются спутанность сознания, подозрение на делирий, неукротимая рвота с примесью крови, выраженная боль в груди, тяжёлая одышка, судороги — врач немедленно предложит стационар. Безопасность важнее удобства.
    Подробнее тут – http://kapelnica-ot-zapoya-vidnoe7.ru/prokapatsya-ot-alkogolya-v-vidnom/https://kapelnica-ot-zapoya-vidnoe7.ru

  29. serviceMuh's avatar serviceMuh says:

    Обратитесь в сц для решения проблем с вашей поломкой

  30. serviceMuh's avatar serviceMuh says:

    Обратитесь в сервис для решения проблем с вашей поломкой

  31. serviceMuh's avatar serviceMuh says:

    Обратитесь в сервис-центр для решения проблем с вашей поломкой

  32. Curtistop's avatar Curtistop says:

    Домашний формат удобен, если нет признаков угрозы жизни и дома можно обеспечить спокойную обстановку. Врач приезжает без опознавательных знаков, начинает с очной оценки рисков и допуска к инфузионной терапии, сверяет принятые ранее препараты и аллергии, объясняет план действий и ожидаемую динамику. Далее запускается капельница: мягкая коррекция жидкости и электролитов, поддержка печени, симптом-контроль тревоги, тошноты, головной боли и тремора. На руки выдаются понятные рекомендации на 24–48 часов: питьевой режим, питание, сон, признаки тревоги и алгоритм связи с дежурным врачом.
    Подробнее – https://vyvod-iz-zapoya-moskva8.ru/vyvod-iz-zapoya-na-domu-v-moskve

  33. MariaGrems's avatar MariaGrems says:

    Ниже — сводный ориентир по этапам. Это не жёсткий график, а понятная канва процесса, которую врач адаптирует под клиническую картину.
    Изучить вопрос глубже – https://narkolog-na-dom-voskresensk8.ru/narkolog-na-dom-nedorogo-v-voskresenske

  34. IsmaelNiz's avatar IsmaelNiz says:

    This post is priceless. Where can I find out more?
    битц казино

  35. Crowngreen is a popular online casino that provides thrilling games for users. Crowngreen excels in the online gaming world and has earned reputation among visitors.

    Every visitor at https://scienceinindia.org/try-your-luck-at-crowngreen-casino-and-boost-your/
    has the chance to play exclusive tournaments and take advantage of rewarding bonuses. Crowngreen Casino provides reliable gameplay, smooth transactions, and round-the-clock customer support for every player.

    With , players explore a diverse selection of casino games, including classic options. The platform focuses on user satisfaction and guarantees an enjoyable gaming environment.

    Whether you are new or an expert, Crowngreen guarantees unique experiences for everyone. Start playing at Crowngreen today and experience exciting games, exclusive bonuses, and a reliable gaming environment.

  36. Education's avatar Education says:

    Cabinet IQ
    15030 N Tatum Blvd #150, Phoenix,
    AZ 85032, United Տtates
    (480) 424-4866
    Education

  37. Merlebon's avatar Merlebon says:

    Этот текст призван помочь читателю расширить кругозор и получить практические знания. Мы используем простой язык, наглядные примеры и структурированное изложение, чтобы сделать обучение максимально эффективным и увлекательным.
    Откройте для себя больше – https://howtostart.digital/securing-seed-funding-a-guide-to-getting-started

  38. serviceMuh's avatar serviceMuh says:

    Обратитесь в сц для решения проблем с вашей поломкой

  39. взломанные игры с модами — это
    удивительная возможность
    повысить качество игры. Особенно если вы играете на мобильном устройстве с Android, модификации открывают перед вами новые возможности.
    Я часто использую игры с обходом системы защиты, чтобы удобнее проходить игру.

    Моды для игр дают невероятную свободу выбора, что погружение в игру гораздо увлекательнее.
    Играя с модификациями, я могу повысить уровень
    сложности, что добавляет виртуальные путешествия и делает игру более достойной внимания.

    Это действительно захватывающе, как такие моды могут улучшить игровой процесс, а при этом с максимальной безопасностью использовать такие модифицированные приложения
    можно без особых опасностей, если быть внимательным и следить за обновлениями.

    Это делает каждый игровой процесс более насыщенным, а возможности практически бесконечные.

    Рекомендую попробовать такие
    модифицированные версии для Android —
    это может открыть новые горизонты

  40. Rochester Concrete Products
    7200 N Broadwa Ave,
    Rochester, MN 55906, United Ѕtates
    18005352375
    Retaining wall styles

  41. Emerydof's avatar Emerydof says:

    Для максимальной эффективности мы предлагаем несколько сценариев — от разового экстренного вмешательства до длительного сопровождения ремиссии. Выбор формата определяется состоянием, анамнезом и целями пациента. Возможен гибридный маршрут: старт на дому, затем — дневной стационар или госпитализация, а после стабилизации — амбулаторное сопровождение.
    Получить дополнительные сведения – https://narkologicheskaya-pomoshch-ramenskoe7.ru/skoraya-narkologicheskaya-pomoshch-v-ramenskom/

  42. Homercer's avatar Homercer says:

    Медикаментозное пролонгированное
    Подробнее – центр кодирования от алкоголизма

  43. GeorgeGem's avatar GeorgeGem says:

    Даже если кажется, что «пройдёт само», при запойных состояниях осложнения нарастают быстро. Перед списком отметим логику: показания к инфузионной терапии определяет врач по совокупности симптомов, хронических заболеваний и текущих показателей. Ниже — типичные ситуации, при которых капельница даёт предсказуемый клинический эффект и снижает риски.
    Подробнее тут – https://kapelnica-ot-zapoya-vidnoe7.ru/kapelnica-ot-zapoya-cena-v-vidnom

  44. serviceMuh's avatar serviceMuh says:

    Для пользователей техники LG — отличная статья про обслуживание LG, объяснено, как избежать повторных поломок.

  45. Claudedub's avatar Claudedub says:

    Алгоритм одинаково прозрачен в обоих форматах. Сначала — экспресс-диагностика: уровень сознания, сатурация, пульс, давление, температура, оценка неврологического статуса и обезвоживания. Затем врач формирует индивидуальную инфузионную схему: регидратационные растворы, коррекция электролитов, поддержка печени и нервной системы, адресная симптоматическая помощь (сон, тревога, тошнота, головная боль). Темп и объём подбираются по переносимости — без «универсальных коктейлей» и лишних препаратов.
    Исследовать вопрос подробнее – вывод из запоя клиника

  46. GeorgeGem's avatar GeorgeGem says:

    Даже если кажется, что «пройдёт само», при запойных состояниях осложнения нарастают быстро. Перед списком отметим логику: показания к инфузионной терапии определяет врач по совокупности симптомов, хронических заболеваний и текущих показателей. Ниже — типичные ситуации, при которых капельница даёт предсказуемый клинический эффект и снижает риски.
    Изучить вопрос глубже – https://kapelnica-ot-zapoya-vidnoe7.ru/

Leave a Reply

Your email address will not be published. Required fields are marked *