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>(FilterType.StartsWith, "P", a => a.Jmeno);

                //...a datum narození je starší než rok 1976
                filter.AddDateTime<Osoba>(FilterType.Less, new DateTime(1976, 1, 1), a => a.DatNarozeni);

                ProxyList osoby = filter.GetProxyList();
                osoby.Query();

                foreach (Osoba osoba in osoby.Cast<Osoba>())
                    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<Osoba>();

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>(FilterType.StartsWith, "P", a => a.Jmeno);
                filter.AddDateTime<Osoba>(FilterType.Less, new DateTime(1975, 12, 31), a => a.DatNarozeni);
                //...a plat muže je vyšší než 10 000...
                filter.AddDecimal<Muz>(FilterType.Greater, 10000, a => a.Plat);

                ProxyList osoby = filter.GetProxyList();
                osoby.Query();

                foreach (Osoba osoba in osoby.Cast<Osoba>())
                    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<Osoba>())
                        Console.WriteLine(osoba.ToString());

                    Console.ReadLine();
            }