流畅的Nhibernate表达式选择标记的枚举

mba*_*ema 8 c# linq enums fluent-nhibernate

我有一个域实体,它有一个标记的枚举作为属性.标记的枚举是这些实体的目标受众.然后,用户具有他们应该看到的实体的标记枚举值.我试图找出正确的表达式来选择满足用户目标受众的实体.

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

[Flags]
public enum TargetAudience
{
    Audience1 = 1,
    Audience2 = 2,
    Audience3 = 4,
    Audience4 = 8
}
Run Code Online (Sandbox Code Playgroud)

表达式:(这在a上执行时有效IList<File>,但对数据库的查询不起作用.)

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

任何的意见都将会有帮助.

Jay*_*Jay 1

在对数据库的查询中它以什么方式不起作用?

您没有显示完整的实现或映射。您是否坚持使用TargetAudience数字数据类型?

除非您跳过一些步骤来执行此操作,否则您的枚举将作为文本存储在数据库中,因此您无法对其执行按位操作。(这种行为与我在博客等中看到的一些行为相反,所以我不知道(a)自以前的版本以来它是否发生了变化,(b)它是否对我所使用的 SQLite 提供程序来说是唯一的正在使用,或 (c) 如果 Fluent NHibernate 以这种方式映射。)

可以进行文本比较。组合标志存储为逗号分隔的列表,因此TargetAudience.Audience4 | TargetAudience.Audience1不会持久保存为9,而是保存为Audience1, Audience4。请注意,即使我以相反的顺序指定它们,它也会按升序保留。

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

您可以快速编写一些[扩展]方法来封装进行这些文本比较的麻烦。

编辑:

请参阅如何使用流畅的 NHibernate 将枚举映射为 int 值?有关将枚举持久化为整数的信息