我有一个域实体,它将标记的枚举作为属性。标记的枚举是这些实体的目标受众。然后,用户具有他们应该看到的实体的标记枚举值。我试图找出正确的表达式来选择满足用户目标受众的实体。
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); }
}
任何建议都会有所帮助。
答案 0 :(得分: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");
您可以在短时间内编写一些[扩展]方法,这些方法将封装进行这些文本比较的肮脏。
有关将枚举持久化为整数的信息,请参阅How do you map an enum as an int value with fluent NHibernate?
答案 1 :(得分:0)
您可以使用方法CustomType将枚举属性映射为int列。
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>();
});