Свободное выражение Nhibernate для выбора по отмеченному перечислению - PullRequest
8 голосов
/ 07 апреля 2010

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

public class File
{
    public virtual TargetAudience TargetAudience { get; set; }
}

[Flags]
public enum TargetAudience
{
    Audience1 = 1,
    Audience2 = 2,
    Audience3 = 4,
    Audience4 = 8
}

Выражение: (Это работает, когда выполняется на IList<File>, но не работает при запросе к базе данных.)

public Expression<Func<File, bool>> Expression
{
     get { return ((x.TargetAudience & UserTargetedAudience) > 0); }
}

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

Ответы [ 2 ]

1 голос
/ 08 апреля 2010

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

Вы не показываете свою полную реализацию или ваше отображение.Вы сохраняете TargetAudience в виде числового типа данных?

Если вы не перепрыгиваете через некоторые обручи, ваше перечисление будет сохранено в виде текста в базе данных, поэтому вы не сможетевыполнять побитовые операции над ним. (Это поведение противоречит тому, что я видел в блогах и т. д., поэтому я не знаю (а), изменилось ли оно по сравнению с предыдущими версиями, (b) если он каким-то образом уникален для провайдера SQLite, который я использую, или (c) если он отображен таким образом Fluent NHibernate.)

Вы можете выполнить текстовое сравнение.Объединенные флаги сохраняются в виде списка через запятую, поэтому TargetAudience.Audience4 | TargetAudience.Audience1 будет сохраняться не как 9, а как Audience1, Audience4.Обратите внимание, что он сохраняется в порядке возрастания, даже если я указал их в обратном порядке.

var query = session.Linq<File>()
    .Where(f => f.TargetAudience.ToString() == "Audience1, Audience4");

Вы можете написать несколько методов [extension] в короткие сроки, которые инкапсулируют гадость при выполнении этих текстовых сравнений.

edit:

См. Как отобразить перечисление в виде значения int с беглым NHibernate? для получения информации о сохраняющихся перечислениях как целых числах

0 голосов
/ 08 апреля 2010

Вы можете отобразить свойство 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>();
});
...