Как вы сравниваете перечисления с несколькими установленными битами?Я, должно быть, упускаю что-то простое.
У меня целевое постоянное значение одного перечисления, и у меня есть настройки пользователя того же перечисления.Мне нужно сравнить два, чтобы увидеть, есть ли одно совпадение с одним или несколькими установленными битами перечисления.
Бонус: я хотел бы использовать здесь побитовые операторы для сокращения запроса linq (потому что я повторяю это 5 или6 раз за разные свойства).Я знаю, что это нелегко прочитать, но это действительно поможет производительности в том, что я делаю.
public enum Targets
{
NotSet = 0,
Anonymous = 1,
Everyone = 2
Adult = 4,
Child = 8,
LikesFishing = 16
}
У меня есть пользователи с несколькими установленными целями:
var loggedInUser = new User()
{
Username = "eduncan911",
Targets = Targets.Everyone | Targets.Adult | Targets.LikesFishing
};
У меня есть статьи снесколько разных целей:
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
};
Как запросить статьи, для которых установлен 1 бит цели, который соответствует как минимум 1 цели указанного выше пользователя (1 или более)?Я должен получить первые две статьи, потому что они соответствуют Targets.Adult - но loggedInUser.Targets не соответствует ни одному биту в третьем наборе целей.
Я знаю, что могу запрашивать статьи для определенного типа Enum,как это:
var articles =
db.Articles.Where(x => x.Targets.HasFlag(Targets.LikesFishing);
Но у меня нет единственной цели - у меня установлено несколько битов.Следовательно, передача только «loggedInUser.Targets» никогда не будет соответствовать никому, поскольку сохраненное значение является просто целым числом.
Сначала я запрашивал перечисления следующим образом:
// 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));
Носравнивая коллекцию с другой коллекцией статей, которые я установил, я всегда возвращался к каждой статье.Я думаю, что отправляюсь в ла-ла-лэнд.
Есть ли побитовая операция, которую я могу передать в выражение linq db.Articles.Where (...) для сравнения двух?
Просто предположение, но я замечаю, когда я запрашиваю цели статьи, у меня NotSet также возвращает true - независимо от того, какой я ~ Targets.NotSet или нет.Одд.