В кэшировании запросов к базе данных нет ничего плохого. Для каждого имени категории вы можете сохранить идентификатор в словаре в качестве примера, срок действия которого истекает через определенный период времени. Это удалит вызовы БД в этом случае. Как пример:
Dictionary<string, int> categoryIdLookup;
Это может быть сохранено в кеше HTTP и получено, если оно пустое (т. Е. Оно никогда не добавлялось или не выпало из кеша), строит словарь, ищет правильный Id и затем переписывает.