Parse Enum avec FlagsAtsortingbute à un SqlParameter

J'ai un atsortingbut Enum with Flags.

[Flags] public enum AlcoholStatus { NotRecorded = 1, Drinker = 2, NonDrinker = 4 } 

Je crée un paramètre Sql comme ci-dessous.

 new SqlParameter("@AlcoholStatus", SqlDbType.VarChar) {Value = (int) AlcoholStatus} 

Si AlcoholStatus a toutes les valeurs (NotRecorded | Drinker | NonDrinker), il renvoie 7 comme valeur pour SqlParameter.

J'parsing ce paramètre pour une procédure stockée et je préfère si je peux parsingr la valeur comme "1,2,3". Quelle est la meilleure façon de faire cela?

Ou existe-t-il un autre moyen facile de filterr les loggings en analysant la valeur entière 7 à la procédure stockée?

EDIT: Cela se produit dans un filter fonctionnellement où l'user veut voir les personnes avec l'un des statuts ci-dessus. C'est une requête sql assez compliquée. Là, je filter AlcoholStatus comme ci-dessous

 WHERE AlcoholStatus IN "1,2,4," 

Laissant de côté que cette énumération ait un sens en tant que [Flags] , l'OMI est le seul moyen sensé de stocker ces données dans une colonne int . Il suffit de stocker la valeur – rien d'autre n'est requirejs. Essayer de le contraindre comme un varchar est une erreur. Le travail de la database est de stocker des données , ne pas se soucier de la présentation.

Si vous avez besoin de filterr cela, vous pouvez utiliser des opérateurs au niveau du bit dans la search, mais notez que la performance est affectée depuis lors de la search par combinaison (plutôt que par l'égalité, qui peut utiliser un index non-cluster). Si vous avez besoin de searchr des combinaisons arbitraires , pensez à la dénormalisation à la place. Si vous avez seulement besoin de searchr sur des bits prévisibles, vous pouvez les extraire avec une colonne indexée persistante calculée, c'est-à-dire que vous pouvez avoir une colonne IsDrinker automatique ( bit ) qui représente le bit 2.

Vous pouvez passer 7 à la procédure stockée et faire vos adieux aux avantages que vous pourriez get d'un index dans la colonne AlcoholStatus si vous démarrez des valeurs AND dans une clause WHERE.

Quelque chose comme le ci-dessous pourrait être ce que vous searchz si vous avez besoin de créer une string d'ID. Optimiser au besoin – Je n'ai pas tenu count du fait qu'il n'y a que trois drapeaux dans votre énumération, par exemple.

Vous devrez également faire attention à l'injection SQL si vous trafiquez des strings dans votre SQL lors de la création d'instructions.

 ssortingng values = ""; for(int i = 0; i < 30; ++i) { if((((int)AlcoholStatus) & (1 << i)) != 0) { if(values != "") { values += ","; } values += (i + 1).ToSsortingng(); } } 

A l'avant, je sais très peu de choses sur le server-suite … mais …

Voulez-vous dire un new SqlParameter("@AlcoholStatus", SqlDbType.VarChar) {Value = (int) client.AlcoholStatus} de la class "Client" imaginaire (au lieu du type enum AlcoholStatus)?

Aussi, j'aurais tendance à penser qu'un champ "Binary Flags" serait "naturellement" stocké dans un champ entier … et probablement un champ non signé. VarChar semble juste un choix étrange.

Si je comprends bien, vous essayez de filterr pour certains scénarios, par exemple, vous pouvez utiliser des opérations au niveau du bit pour votre où, par exemple, SELECT * FROM MyTable WHERE AlcoholStatus & 0x3 sélectionnerait Not Registereded et Drinker simultanément. Vous pouvez également mettre en place une procédure stockée qui convertit AlcoholStatus en une string comme 1,2,3 en utilisant une série de cas.

J'ai écrit ci-dessous la méthode pour get les identifiants enum séparés par des virgules afin de les parsingr dans la database.

 private static ssortingng GetAlcoholStatuses(Enums.Enums.AlcoholStatus? alcoholStatus) { if (alcoholStatus == null) return ssortingng.Empty; Enums.Enums.AlcoholStatus alcoholStatusValue = alcoholStatus.Value; ssortingng alcoholStatuses = ssortingng.Empty; if (alcoholStatusValue.HasFlag(Enums.Enums.AlcoholStatus.Drinker)) { alcoholStatuses = ssortingng.Format("{0}{1}{2}", alcoholStatuses, (int)Enums.Enums.AlcoholStatus.Drinker, ","); } if (alcoholStatusValue.HasFlag(Enums.Enums.AlcoholStatus.NonDrinker)) { alcoholStatuses = ssortingng.Format("{0}{1}{2}", alcoholStatuses, (int)Enums.Enums.AlcoholStatus.NonDrinker, ","); } if (alcoholStatusValue.HasFlag(Enums.Enums.AlcoholStatus.NotRecorded)) { alcoholStatuses = ssortingng.Format("{0}{1}{2}", alcoholStatuses, (int)Enums.Enums.AlcoholStatus.NotRecorded, ","); } return alcoholStatuses; }