ProxyList

Třída „ProxyList je asi nejzajímavější a také nabízí nejvíce funkčností, které nám výše uvedený příklad neukázal.
Výše jsme použili kód:

            ProxyList list =
                ctx.GetProxyList()
                .Query("select OID from Osoba where Jmeno='{0}' and Prijmeni='{1}'", jmeno, prijmeni);
            Proxy proxy = list.Count > 0 ? list[0] : null;

Třída „ProxyList nám nabízí použití parametrů:

            ProxyList list = ctx.GetProxyList();
            list.Sql = "select OID from Osoba where Jmeno=@Jmeno and Prijmeni=@Prijmeni";
            list.AddParameter("@Jmeno", jmeno, SqlDbType.VarChar);
            list.AddParameter("@Prijmeni", prijmeni, SqlDbType.VarChar);
            list.Query();
            Proxy proxy = list.Count > 0 ? list[0] : null;

Seznam parametrů lze smazat metodou „ClearParameters:

            list.ClearParameters();

U kratších seznamů se může hodit možnost „odložit si jejich obsah“ do textové proměnné prostřednictvím metody „ToString:

            static void Main(string[] args)
            {
                Init();


                ProxyList list = Rivet.Instance.Query("select OID from Osoba");
                string oids = list.ToString();
                Console.WriteLine(oids);
                Console.ReadLine();
            }

Vypíše seznam hodnot OID, odpovídající načteným objektům, oddělených čárkami:

Naopak, z textového seznamu hodnot OID oddělených čárkami, lze vytvořit objekt „ProxyList pomocí statické metody „Create:

            static void Main(string[] args)
            {
                Init();

                ProxyList list1 = Rivet.Instance.Query("select OID from Osoba");
                string oids = list1.ToString();

                using (Context ctx = Rivet.Instance.GetContext())
                {
                    ProxyList list2 = ProxyList.Create(ctx, oids);
                    foreach (Osoba osoba in list2.Cast<Osoba>())
                        Console.WriteLine(osoba.ToString());
                }

                Console.ReadLine();
            }

Ačkoli seznam „list2 vznikl pouze na základě stringu „oids, načetl se seznam odpovídajících osob:

Množinové operace s objekty „ProxyList

Výše jsme se již setkali s operacemi „Union a „Subtract.

  • Union(ProxyList list) – sjednocení – k objektům instance přidá objekty parametru
  • Add(Proxy proxy) – přidání - k objektům instance přidá objekt parametru
  • Subtract(ProxyList list) – odebrání - ze seznamu objektů instance odebere objekty parametru
  • Subtract(Proxy proxy) – odebrání - ze seznamu objektů instance odebere objekt parametru
  • Intersection(ProxyList list) – průnik - v seznamu objektů instance ponechá jen ty objekty, které obsahuje i parametr

Pozn.:

  1. Tyto operace probíhají „v odpojeném stavu“, tzn. že se v nich v tomto okamžiku nekontroluje skutečná existence objektů v databázi.
  2. Při těchto operacích nevzniká duplicita objektů.

Poznatky:

  • jádrem třídy „ProxyList je prostý seznam hodnot OID objektů => jednoduchost, odpojenost
  • pokud používáme stránkování, seznam obsahuje OID pouze objektů z aktuální stránky

Stránkování

Třída „ProxyList obsahuje sadu metod a vlastností, podporujících snadné stránkování. Pokud máme seznam stránkovat, musíme ho nějak setřídit. Proto má metoda „Page“ argumenty pro třídění.
Příklad stránkovaného seznamu (stránkovací metody a vlastnosti jsou zvýrazněny):

            private static void StrankovanySeznam()
            {
                ProxyList list = Rivet.Instance.Query("select OID from Osoba");
                list.PageLength = 3;
                list.ToFirstPage();

                while (true)
                {
                    Console.WriteLine(string.Format("---{0}/{1}---", list.PageIndex + 1, list.PageCount));

                    ProxyList page = list.Page<Osoba>(SortDirection.Asc, a => a.DatNarozeni);
                    foreach (Osoba osoba in page.Cast<Osoba>())
                        Console.WriteLine(osoba.ToString());

                    if (list.IsLastPage)
                        break;

                    list.ToNextPage();
                }

                Console.ReadLine();
            }

Dostaneme toto: