Comment comparez-vous les enums ayant plusieurs bits? Je dois manquer quelque chose de simple.Comparer deux enums w/bitwise pour un seul vrai résultat?
J'ai une valeur persistante cible d'un enum, et j'ai les paramètres de l'utilisateur de cette même énumération. J'ai besoin de comparer les deux pour voir s'il y a une seule correspondance d'un ou plusieurs bits enum définis.
Bonus: J'aimerais utiliser ici les opérateurs bit à bit pour raccourcir la requête linq (parce que je la réplique 5 ou 6 fois pour différentes propriétés). Je sais que ce n'est pas facile à lire, mais cela aiderait vraiment la performance dans ce que je fais.
public enum Targets
{
NotSet = 0,
Anonymous = 1,
Everyone = 2
Adult = 4,
Child = 8,
LikesFishing = 16
}
Je les utilisateurs avec de multiples objectifs fixés:
var loggedInUser = new User()
{
Username = "eduncan911",
Targets = Targets.Everyone | Targets.Adult | Targets.LikesFishing
};
J'ai des articles définis avec plusieurs cibles différentes:
var article1 = new Article()
{
Title = "Announcement for Parents and Children",
Targets = Targets.Adult | Targets.Child
};
var article2 = new Article()
{
Title = "What fishing boat do you own?",
Targets = Targets.LikesFishing | Targets.Adult
};
var article3 = new Article()
{
Title = "Be nice to your parents!",
Targets = Targets.Child
};
Comment puis-je interroger des articles qui a 1 cible bit défini qui correspond au moins à 1 des cibles de l'utilisateur spécifié ci-dessus (1 ou plus)? Je devrais récupérer les deux premiers articles parce qu'ils correspondent à Targets.Adult - mais le loggedInUser.Targets ne correspond à aucun bit dans le 3ème ensemble de cibles.
Je sais que je peux interroger des articles pour un type Enum spécifique, comme celui-ci:
var articles =
db.Articles.Where(x => x.Targets.HasFlag(Targets.LikesFishing);
Mais, je n'ai pas une seule cible - j'ai plusieurs bits mis. Par conséquent, le fait de transmettre simplement "loggedInUser.Targets" ne correspondra à aucun car la valeur stockée est juste un int.
Au début, j'Interrogation pour énumérations comme ceci:
// returns a collection of enums the user has set
// in their profile.
var loggedInUserEnums =
Enum.GetValues(typeof(Targets))
.Cast<Targets>()
.Where(x => loggedInUser.Targets.HasFlag(x));
Mais lorsque l'on compare la collection à l'autre collection de quels articles ont mis, je toujours en revenir vrai pour chaque article. Je pense que je partais pour la terre.
Y at-il une opération de bits que je peux passer dans l'expression linq db.Articles.Where (...) de comparer les deux? Juste une supposition, mais je remarque quand je demande des cibles d'article que j'ai NotSet retournant vrai aussi - peu importe I ~ Targets.NotSet ou pas. Impair.
nourriture supplémentaire pour la pensée: Ai-je besoin de boucler les loggedInUserEnums un nd requête pour chaque Enum? Cela me semble coûteux quand je pense qu'il devrait y avoir une requête bit à bit pour cela. – eduncan911
Est-il sûr de supposer que par "Linq" vous voulez dire linq à sql ou un autre fournisseur de requête de base de données linq? – marr75
Je m'excuse. Je veux dire "Lambda", pas linq. – eduncan911