Czy da się to lepiej napisać?

0

Hej, jeszcze do końca nie kumam LINQ, czy da się poniższe przypisanie własności VM napisać zwięźlej, czy lepiej po prostu wrzucić to w metodę repo i się nie przejmować? Kod działa, ale napisałem go trochę łopatologicznie.

public async Task<IActionResult> Edit(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }
            var productDb = await _context.Products
                .Include(i => i.CPs)
                .ThenInclude(i => i.Client)
                .AsNoTracking()
                .SingleOrDefaultAsync(m => m.ProductID == id);
            if (productDb == null)
            {
                return NotFound();
            }
            var productsClients = productDb.CPs.Select(c => c.ClientID); //pobranie z modelu join
            //ładowanie VM
            productVM.ProductID = productDb.ProductID;
            productVM.Name = productDb.Name;
            productVM.Description = productDb.Description;
            productVM.Price = productDb.Price;
            productVM.ClientIds = productsClients.ToArray(); //array Clinets z CPs
            productVM.Clients = PopulateCliensList();
            return View(productVM); //zwróć VM
        }
1
  1. Jak masz metodę oczekującą Id, a ten Id nie jest przekazany to powinien polecieć BadRequest, więc ten znak zapytania i późniejszy check w kodzie są bez sensu.
  2. Wywal AsNoTracking jak i tak potem robisz "Single" na tym.
  3. Użyj czegoś do mapowania tych obiektów, np. Automapper, ValueInjector
0

Przeczytaj to

1 użytkowników online, w tym zalogowanych: 0, gości: 1