Как вы сравниваете перечисления с несколькими битами? Я должен пропустить что-то простое.Сравнение двух перечислений с побитовым для одного True результата?
У меня есть целевое постоянное значение одного перечисления, и у меня есть настройки пользователя этого же перечисления. Мне нужно сравнить эти два, чтобы увидеть, существует ли одно совпадение одного или нескольких битов перечисления.
Бонус: Мне бы хотелось использовать побитовые операторы здесь, чтобы сократить запрос 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 Target Набор бит который соответствует как минимум 1 цели указанного пользователя выше (1 или более)? Я должен вернуть первые две статьи, потому что они соответствуют Targets.Adult, но loggedInUser.Targets не соответствует ни одному бит в 3-м наборе целей.
Я знаю, что могу запросить статьи для определенного типа Enum, как это:
var articles =
db.Articles.Where(x => x.Targets.HasFlag(Targets.LikesFishing);
Но, у меня нет одной цели - у меня есть несколько битов набора. Следовательно, передача только «loggedInUser.Targets» никогда не будет соответствовать ни одному, поскольку сохраненное значение является просто int.
Сначала я запрашивая перечисления как это:
// 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, независимо от I ~ Targets.NotSet или нет. Странный.
дополнительной пищи для размышлений: нужно ли цикл в loggedInUserEnums nd для каждого Enum? Мне кажется дорогостоящим, когда я думаю, что для этого должен быть побитовый запрос. – eduncan911 2010-12-15 22:47:42
Можно ли предположить, что «Linq» означает linq to sql или какой-либо другой поставщик запросов к базе данных linq? – marr75 2010-12-15 22:52:53
Прошу прощения. Я имею в виду «Лямбда», а не linq. – eduncan911 2010-12-15 23:09:20