Baza danych oraz (MVC)Controller i jego ciężkie zadanie

0

Witam

Stworzyłem baze danych, która zawiera 7000 rekordów, napisałem również procedurę do wyświetlenia wszystkich użytkowników. Czas na zadanie aplikacji. Bazuje ona na MVC. Pomijam fakt, że trochę trzeba poczekać ( kilka sekund - 8 może do 12 - nieistotne ) nim się uruchomi, jest to efektem tegoż zabiegu:

public partial class View : Form, Controller.IControllerMain
    {
        Controller.MainController _controller;
        home home = new home();
        userControlClients clients = new userControlClients();

        #region Constructor

        public View()
        {
            InitializeComponent();
            this.Content.Controls.Add(home);
        }

        #endregion

......
 

Na starcie tworzę instancję UserControl-ki (home) no i tą, z którą trzeba coś zrobić, czyli userControlClients, jej konstruktor to:

 
public userControlClients()
        {
            InitializeComponent();
            this._controller = new ClientsController(this);
            _controller.LoadView();
        }

metoda w kontrolerze, która odpowiada za pobranie danych do wyświetlenia ma się tak:

public void LoadView()
        {
            var con = Database.Open();
            List<Clients> clients = con.ShowAllClients();
            foreach (Clients client in clients)
            {
              _clientsView.ShowAllClients(client);
            }
        }
 

To właśnie ona pobiera z bazy wszystkich klientów i przekazuje do widoku. Czy to, że aplikacja uruchamia się kilka sekund przy 5000 rekordów to normalne? Wydaje mi się, że można coś zrobić z takim czymś, można niby początkowo pobierać z bazy

TOP 1000

, lecz nie wiem jak to ma się do sztuki programowania i ogólnych dobrych zwyczajów. Jak wy sobie z tym radzicie?

Pozdrawiam

Edit:

Poradziłem sobie, jak to powiedziałem "o jeden foreach za daleko" :)

1

Ale po co ładować od razu 7000 rekordów? Zazwyczaj stosuje się stronicowanie.

0

Od razu powiem, że z podniecenia simpledata tu była gafa:

 public void LoadView()
        {
            var con = Database.Open();
            List<Clients> clients = con.ShowAllClients();
            foreach (Clients client in clients)
            {
              _clientsView.ShowAllClients(client);
            }
        }
 

popawione na :

 public void LoadView()
        {
            var con = Database.Open();
            List<Clients> clients = con.ShowAllClients();
            _clientsView.ShowAllClients(clients);
        }
 

Złoty debuger, o stronicowanie, już czytam i robię, dziękuję za złotą wskazówkę.

Edit, w APS ( pewnie być może w WPF ) jest kontrolka <Page>, niestety w WinForms jej nie ma i samemu trzeba wymyślić sposób na stronicowanie ( dobra przegiołem ). Pobranie 10 rekordów czy 20 do mojego ListView trwa tyle co nic, przy każdym użyciu poziomego scrolla moim zdaniem winno wysłać się do procedury parametr, który by wiedział do jakiego rekordu max ma wczytać dane - dobre? W Sql Server 2012 są funkcję OFFSET i FETCH, które pozwolą nam pobranie rekordó z danego przedziału. Czy jedynym wyjście jest ROW_NUMBER() z połączeniem BETWEEN? Ex:

SELECT one, two, three from Table WHERE Rows  BETWEEN oldValue AND newValue

Rows oczywiśce pobrane. Zastanawia mnie tylko czy dobrym pomysłem jest na zdarzenie przewinięcia scrolla wysyłać do kontrolera za każdym razem dwa parametry a w widoku, dodawać rekordy z konkretnego przedziału, aby uniknąć dotychczasowego zamulenia.. Czuje, że byłoby to przekombinowane. Albo za jednym zamachem wczytać wszystko - przy starcie programu ale w metodzie, która odpowiada za wyświetlenie danych w widoku przy użyciu lambd na zdarzenie przewijania scrolla, dodawać do ListView odpowiednie rekordy z danego przedziału. Jakby może wzorował się na tym: http://www.ezineasp.net/post/ASP-Net-2-0-Gridview-Paging-using-C-sharp.aspx .

Pozdrawiam

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