public async Task <IActionResult> CreateMenuItem(String RestaurantName, String MenuName, [Bind("Name,Ingredients,Alergens,Price,Image")] MenuItem entity) { var checkIfExistsExpr = from selectRestaurant in RestaurantDomain.GetRestaurant(RestaurantName) let restaurant = (selectRestaurant as RestaurantSelected)?.RestaurantAgg.Restaurant from selectMenu in RestaurantDomain.GetMenu(MenuName, restaurant.Id) let menu = (selectMenu as MenuSelected)?.MenuAgg.Menu from selectMenuItem in RestaurantDomain.GetMenuItem(entity.Name, menu.Id) select selectMenuItem; var checkIfExistsResult = await interpreter.Interpret(checkIfExistsExpr, Unit.Default); return(await checkIfExistsResult.MatchAsync <IActionResult>( async exists => { return BadRequest(); }, async inexistent => { var expr = from selectRestaurant in RestaurantDomain.GetRestaurant(RestaurantName) let restaurant = (selectRestaurant as RestaurantSelected)?.RestaurantAgg.Restaurant from selectMenu in RestaurantDomain.GetMenu(MenuName, restaurant.Id) let menu = (selectMenu as MenuSelected)?.MenuAgg.Menu from createEntity in RestaurantDomain.CreateAndPersistMenuItem(menu, entity) let entityC = (createEntity as MenuItemCreated)?.MenuItemAgg select createEntity; var result = await interpreter.Interpret(expr, Unit.Default); return await result.MatchAsync <IActionResult>( async(created) => { await interpreter.Interpret(Database.AddOrUpdateEntity(created.MenuItemAgg.MenuItem), Unit.Default); return (IActionResult)Ok(created.MenuItemAgg.MenuItem); }, async(notCreated) => { return BadRequest(); }); } )); }