我有一个域实体,它有一个标记为属性的枚举。标记的枚举是这些实体的目标受众。然后,用户有一个他们应该看到的实体的标记枚举值。我正在尝试找出正确的表达式来选择满足用户目标受众的实体。
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); }
}
任何建议都会有所帮助。
最佳答案
在对数据库的查询中,它以什么方式不起作用?
您没有展示您的完整实现,也没有展示您的映射。您是否将 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");
您可以在短期内编写一些 [扩展] 方法来封装进行这些文本比较的麻烦。
编辑:
参见 How do you map an enum as an int value with fluent NHibernate?有关将枚举持久化为整数的信息
关于c# - 流利的 Nhibernate 表达式来选择标记的枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2592856/