MVC 5 - pobieranie danych z bazy za każdym odświeżeniem strony, czy coś innego?

0

Witam,

Od jakiegoś czasu uczę się MVC 5 i postanowiłem zrobić prostą stronkę, na której można oddać głos w skali 1-10 na restaurację a następnie wyświetlić to jako ranking z możliwością sortowania:

Mam pytanie do wyświetlania tego rankingu. Za pierwszym razem kiedy wczytuję kontroler "Ranking" i akcję "Index" (wyświetla ranking). To pobieram dane z bazy i wyświetlam je i to jest logiczne i jasne.

Natomiast kiedy użytkownik naciśnie na nagłówek nazwa to dane sortują się po nazwie - znowu jest wejście do "Ranking", "Index" i znowu pobieranie danych z bazy itd.
Czy to nie będzie trwało zbyt długo? Nie powinienem zrobić tego w ten sposób, że te dane są już w jakiejś właściwości globalnej i gdy użytkownik sortuje to wykona się sortowanie tej globalnej właściwości?

W tej chwili wygląda to tak:

   public ActionResult Index(string sort)
        {

            RankingListViewModel rlvm = new RankingListViewModel();
            List<RankingViewModel> listrvm = new List<RankingViewModel>();
            RankingBusinessLayer rbl = new RankingBusinessLayer();
            List<Restaurant> restaurant = rbl.GetRestaurant();
            List<RestaurantRate> restaurantRates = rbl.GetRestaurantRates();

            foreach (Restaurant r in restaurant)
            {
                RankingViewModel rvm = new RankingViewModel();
                var listOfRate = from rr in restaurantRates
                                 where rr.RestaurantID == r.RestaurantID
                                 select rr.RateID;

                rvm.Name = r.Name;
                int suma = listOfRate.Sum();
                double count = listOfRate.Count();
                rvm.Avg = suma / count;

                listrvm.Add(rvm);
            }
            rlvm.Rankings = listrvm;

            ViewBag.SortByName = sort == null ? "Nazwa_Malejaco" : "";
            ViewBag.SortByAvg = sort == "Avg_Malejaco" ? "Avg_Rosnaco" : "Avg_Malejaco";

            var list = from l in rlvm.Rankings
                       select l;
            switch (sort)
            {
                case "Nazwa_Malejaco":
                    list = list.OrderByDescending(s => s.Name);
                    break;
                case "Avg_Malejaco":
                    list = list.OrderByDescending(s => s.Avg);
                    break;
                case "Avg_Rosnaco":
                    list = list.OrderBy(s => s.Avg);
                    break;
                default:
                    list = list.OrderBy(s => s.Name);
                    break;
            }

            rlvm.Rankings = list.ToList();
            return View(rlvm);
        }

No i właśnie zastanawiam się, czy to jest OK bo w sumie w momencie odświeżania mogłyby dojść jakieś nowe głosy do bazy więc dobrze gdy jest aktualna w każdym momencie, z drugiej strony każde sortowanie wiąże się z wyciąganiem tych danych - co zabiera trochę pamięci i czasu.

0

Czy czas działania aplikacji jest akceptowalny dla użytkowników? Jeśli tak, to nie przejmuj się tym na razie.
Bardziej mnie martwi ten niepotrzebny switch.

0

Dlaczego niepotrzebny? Przecież w zależności od tego co użytkownik kliknął takie będzie sortowanie.

Na razie mam taki widok do tego:

<div>
    <table class="table">
        <tr>
            <th>
                @Html.ActionLink("Nazwa", "Index", new { sort = ViewBag.SortByName })
            </th>
            <th>
                Oceń
            </th>
            <th>
                @Html.ActionLink("Średnia", "Index", new { sort = ViewBag.SortByAvg })
            </th>
        </tr>
        @foreach (RankingViewModel rvm in Model.Rankings)
        {
            <tr>
                <td>
                    @rvm.Name
                </td>
                <td>
                    @for (int i = 1; i <= 10; i++)
                    {

                        @Html.ActionLink("" + i + " ", "Index", new { rate = i, id = rvm.Name })
                    }
                </td>
                <td>
                    @rvm.Avg
                </td>
            </tr>
        }
    </table>
</div> 
0

I do każdej kolumny będziesz dodawał dwa nowe casy w switchu? I tak dla każdego grida w całej aplikacji?
Przecież to można zrobić generycznie, tak aby sortowanie zbudować na podstawie nazwy klikniętej kolumny i kierunku.

0

Jeżeli list jest kilka (max 10) a kolumn do 5 to switch by nawet uszedł. Ale przy wielu listach jest to zdecydowane złamanie zasady DRY.
Co do wydajności możesz myśleć o różnych formach cache (od tego na poziomie samego silnika bazy, aż do cache na poziomie aplikacji). Pamiętaj że każdy cache wiąże się z rozsynchronizowaniem się widoku i stanu w bazie, jednak często jest to do zaakceptowania.

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