c# - 流利的 Nhibernate 表达式来选择标记的枚举

标签 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); }
}

任何建议都会有所帮助。

最佳答案

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

您没有展示您的完整实现,也没有展示您的映射。您是否将 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/

相关文章:

C# RegEx 在字符串中查找值

c# - 将 RSA 公钥编码为 DER 格式

c# - IIS 部署后样式捆绑不起作用 (MVC 4)

c# - 从数据库中搜索并使用 Entity Framework 进行排序

c# - 检查列表中的下一个最高/最低值并选择该项目

c# - Fluent NHibernate AutoMapper 中的可访问性忽略属性映射

c# - 将 double 转换为 decimal 并在需要时将其加帽

sql - 强制 LINQ to SQL 或 ENTITIES 发出 BETWEEN 运算符

nhibernate - System.Data.SQLite 和 Fluent NHibernate - 找不到 IDBCommand

c# - 使用流利的 nhibernate 的通用查找表