Filtrování (třída FilterHelper)
Pro snažší filtrování je implementována třída „FilterHelper“. Umožňuje jednoduše provádět základní filtrování.
Příklad:
private static void ZobrazitFiltrovane()
{
//filtrujeme nad seznamem osob...
FilterHelper filter = new FilterHelper("select OID from Osoba");
//osoby, jejichž jméno začíná na „P“...
filter.AddString<Osoba>
//...a datum narození je starší než rok 1976
filter.AddDateTime<Osoba>
ProxyList osoby = filter.GetProxyList();
osoby.Query();
foreach (Osoba osoba in osoby.Cast
Console.WriteLine(osoba.ToString());
Console.ReadLine();
}
Metody:
- Add
- AddClass
- AddString
- AddDateTime
- AddInt
- AddDouble
- AddDecimal
Typy filtrace:
- Neutral – nedělá nic
- Equal – rovnost
- NotEqual – nerovnost
- Less – menší než
- LessOrEqual – menší nebo rovno
- Greater – větší než
- GreaterOrEqual – větší nebo rovno
- StartsWith – začíná na (má smysl pro stringy)
- EndsWith – končí na (má smysl pro stringy)
- Like – obsahuje na (má smysl pro stringy)
- Class – vybírá pouze objekty daného typu (viz. níže)
Kdybychom chtěli filtrovat třeba přes vlastnost „Plat“, která se ale nachází v tabulce „Muz“, nikoli tabulce „Osoba“, došlo by k chybě, přestože i objekty typu „Muz“ jsou osobami.
Abychom mohli filtrovat přes libovolné vlastnosti objektu (které mohou ležet v různých propojených tabulkách), nabízí třída „Rivet“ statickou generickou metodu „GetQuery“.
Příklad:
var sql = Rivet.GetQuery
Tato metoda za nás vytvoří kompletní dotaz SELECT s propojením tabulek. V našem případě třídy „Osoba“ to bude:
select Osoba.OID from Osoba
left join Muz on Muz.OID=Osoba.OID
left join Zena on Zena.OID=Osoba.OID
Tato metoda nám tedy vždy poskytne základ, nad nímž může třída „FilterHelper“ pracovat v plném rozsahu.
Pro zjednodušení pak třída „FilterHelper“ nabízí statickou generickou metodu „Create“, která vytvoří instanci filtru s již takto vytvořeným selektem.
Příklad:
private static void ZobrazitFiltrovane()
{
FilterHelper filter = FilterHelper.Create<Osoba>
filter.AddString<Osoba>
filter.AddDateTime<Osoba>
//...a plat muže je vyšší než 10 000...
filter.AddDecimal<Muz>
ProxyList osoby = filter.GetProxyList();
osoby.Query();
foreach (Osoba osoba in osoby.Cast
Console.WriteLine(osoba.ToString());
Console.ReadLine();
}
Filtrování přes typ objektu (zde vyfiltruje pouze ženy):
private static void ZobrazitFiltrovane()
{
FilterHelper filter = FilterHelper.Create<Osoba>
filter.AddClass<Zena>
//je totéž jako
//filter.Add(typeof(Zena), FilterType.Class, true, string.Empty);
ProxyList osoby = filter.GetProxyList();
osoby.Query();
foreach (Osoba osoba in osoby.Cast
Console.WriteLine(osoba.ToString());
Console.ReadLine();
}