Быстрое выражение Nhibernate для выбора на отмеченном перечислении

У меня есть доменный объект, который имеет отмеченное перечисление как свойство. Отмеченное перечисление является целевой аудиторией для этих объектов. У пользователя затем есть отмеченное перечисление значений объектов, которые они должны видеть. Я пытаюсь выяснить корректное выражение для выбора объектов, которые встречают целевую аудиторию для пользователя.

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); }
}

Любые предложения были бы полезны.

8
задан mbalkema 7 April 2010 в 13:40
поделиться

2 ответа

Вы можете отобразить свойство 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>();
});
0
ответ дан 6 December 2019 в 02:24
поделиться

Каким образом это не работает в запросе к базе данных?

Вы не показываете ни свою полную реализацию, ни свое отображение. Вы сохраняете 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? для получения информации о сохранении перечислений как целых чисел

1
ответ дан 6 December 2019 в 02:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: