У меня есть доменный объект, который имеет отмеченное перечисление как свойство. Отмеченное перечисление является целевой аудиторией для этих объектов. У пользователя затем есть отмеченное перечисление значений объектов, которые они должны видеть. Я пытаюсь выяснить корректное выражение для выбора объектов, которые встречают целевую аудиторию для пользователя.
public class File
{
public virtual TargetAudience TargetAudience { get; set; }
}
[Flags]
public enum TargetAudience
{
Audience1 = 1,
Audience2 = 2,
Audience3 = 4,
Audience4 = 8
}
Выражение: (Это работает при выполнении на a IList<File>
, но не работает над запросом к базе данных.)
public Expression<Func<File, bool>> Expression
{
get { return ((x.TargetAudience & UserTargetedAudience) > 0); }
}
Любые предложения были бы полезны.
Вы можете отобразить свойство enum как столбец int с помощью метода CustomType.
public class FileMap : ClassMap<File>
{
Map( x => x.TargetAudience ).CustomType<int>();
}
// or the equivalent for automap
.Override<File>(map => {
map.Map( x => x.TargetAudience ).CustomType<int>();
});
Каким образом это не работает в запросе к базе данных?
Вы не показываете ни свою полную реализацию, ни свое отображение. Вы сохраняете TargetAudience
как числовой тип данных?
Если вы не прыгаете через несколько обручей, ваше перечисление будет сохранено в базе данных в виде текста, поэтому вы не можете выполнять побитовое операции на нем. (Это поведение противоречит тому, что я видел в блогах и т. Д., Поэтому я не знаю (а), изменилось ли оно по сравнению с предыдущими версиями, (б) если оно каким-то образом уникально для SQLite провайдера, которого я использую, или (c) если он отображается таким образом с помощью Fluent NHibernate.)
Вы можете выполнить текстовое сравнение. Комбинированные флаги сохраняются в виде списка, разделенного запятыми, поэтому TargetAudience.Audience4 | TargetAudience.Audience1
будет сохраняться не как 9
, а как Audience1, Audience4
. Обратите внимание, что он сохраняется в порядке возрастания, хотя я указал их в обратном порядке.
var query = session.Linq<File>()
.Where(f => f.TargetAudience.ToString() == "Audience1, Audience4");
Вы могли бы в короткие сроки написать несколько [расширенных] методов, которые инкапсулируют неприятности выполнения этих текстовых сравнений.
См. Как сопоставить перечисление как значение int с помощью свободного NHibernate? для получения информации о сохранении перечислений как целых чисел