Feedback

C# - SqlDataSource.FilterExpression auf Bitflag filtern

Veröffentlicht von am 05.01.2010
(2 Bewertungen)
Leider lässt der "abgespeckte" Filtersyntax der SqlDataSource.FilterExpression keine Bitoperationen zu. Deshalb hier mein 'Workaround'.

Filtern könnte man dann bspw. mit:
SqlDataSource.FilterExpression = "Flag IN " +
HoleFlagFilterExpressionListe(typeof(Testflag),(Int32)Testflag.Testa);

Sry wenn das Snippet nicht besonders ordentlich ist, wird auch vermutlich Leute die noch nicht mit Bitflags gearbeitet haben verwirren.... aber wenn jemand mal auf dasselbe Problem stößt ists ein guter Workaround
GFU-Schulungen  [Anzeige]

C# 2017/2015/2013 Aufbau

In dieser Schulung lernen Sie fortgeschrittene Techniken im Bereich .Net C#. Dabei stehen neben den eigentlichen Techniken auch architektonische Aspekte im Mittelpunkt.

ASP.NET Core und Angular Komplett für .NET-Entwickler

Sie  lernen in drei (3) Tagen wie man mit  ASP.NET Core und den Technologien  MVC, Entity Framework, WebAPI und  Razor professionelle sowie moderne  Web-Anwendungsarchitekturen aufbaut.  Die Schulung ist der perfekte  Einstieg um insbesondere datengetriebene  und präsentationsorientierte  Applikationen auf Basis der robusten und  skalierbaren ASP.NET Core  Plattform zu erstellen. Nach der Veranstaltung kennen Sie die Konzepte von Angular und können Angular in neue und bestehende ASP.NET-Anwendungen einsetzen.

        [Flags]
        private enum Testflag
        {
            Testa = 0x1,   // 00000001
            Testb = 0x2,   // 00000010
            Testc = 0x4,   // 00000100
            Testd = 0x8,   // 00001000
        }

        public String HoleFlagFilterExpressionListe(Type FlagType, Int32 Value)
        {
            // Zunächst wird der Maximumwert des Flags berrechnet der erreicht wird, wenn ALLE flags 'true' sind
            Int32 MaximumWert = 0;
            Int32 AnzahlFlags = (Enum.GetNames(typeof(UpdateFlag)).Length);
            for (int i = 0; i < AnzahlFlags; i++)
            {
                MaximumWert += Putenziere(2, i);
            }

            // Dann werden die 'möglichen' Werte in einer Schleife berechnet
            String FilterExpressionListe = String.Empty;
            for (int i = 1; i <= MaximumWert; i++)
            {
                if (IstFlagGesetzt(i, Value))
                    FilterExpressionListe += "'" + i.ToString() + "',";
            }
            
            FilterExpressionListe = "(" + FilterExpressionListe.Remove(FilterExpressionListe.Length - 1, 1) + ")";

            return FilterExpressionListe;
        }

        private Int32 Putenziere(Int32 Basis, Int32 Putenz)
        {
            if (Putenz == 0)
                return 1;

            Int32 Ergebnis = Basis;

            for (int i = 0; i < Putenz - 1; i++)
            {
                Ergebnis = Ergebnis * Basis;
            }

            return Ergebnis;
        }

        public Boolean IstFlagGesetzt(Int32 BenutzerRechtFlag_Datenbank, Int32 PruefFlag)
        {
            return (PruefFlag & BenutzerRechtFlag_Datenbank) != 0;
        }  

3 Kommentare zum Snippet

Steav schrieb am 05.01.2010:
Int32 AnzahlFlags = (Enum.GetNames(typeof(UpdateFlag)).Length);

Die Zeile wäre korrekt natürlich:
Int32 AnzahlFlags = (Enum.GetNames(FlagType).Length);

Bekomme eine Exception wenn ich den Code bearbeiten will.
Christopher Kk schrieb am 05.01.2010:
Putenz :D das der Brüller des Tags
Steav schrieb am 05.01.2010:
ob das wohl ein freudscher Verschreiber war... :-D
 

Logge dich ein, um hier zu kommentieren!