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
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.:
- 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.
- 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: