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

时间:2010-04-07 13:40:20

标签: c# linq fluent-nhibernate enums

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

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 个答案:

答案 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>();
});