繁体   English   中英

如何在NHibernate中查询存储为枚举的标志

[英]How to query flags stored as enum in NHibernate

如何进行HQL或Criteria搜索(后者是首选)涉及用作标志的枚举。 换句话说,我有一个持久的枚举属性,存储某种标志。 我想查询所有设置了这些标志之一的记录。 使用Eq当然不会起作用,因为只有那是唯一的标志才会成立。

使用Criteria API解决这个问题是最好的,但是如果只使用HQL这样做也很好。

以下是使用条件API执行此操作的方法:

[Flags]
enum Bar{
   A = 0x01,
   B = 0x02,
   C = 0x04
}

var criteria = this.Session.CreateCriteria<Foo>()
            .Add( BitwiseFlags.IsSet( "Bar", Bar.A | Bar.C ) );

使用:

public class BitwiseFlags : LogicalExpression
{
    private BitwiseFlags( string propertyName, object value, string op ) :
        base( new SimpleExpression( propertyName, value, op ),
        Expression.Sql( "?", value, NHibernateUtil.Enum( value.GetType() ) ) )
    {
    }

    protected override string Op
    {
        get { return "="; }
    }

    public static BitwiseFlags IsSet(string propertyName, Enum flags)
    {
        return new BitwiseFlags( propertyName, flags, " & " );
    }
}

应该生成以下输出where子句:

 FROM _TABLE
 WHERE  (this_.Bar & 5 = 5)

这应该给你带有标志Bar.A和Bar.C设置的行(不包括其他所有内容)。 你应该能够将它与连接和分离一起使用。

HQL很简单:

var matching = session.CreateQuery(@"
                       from MyEntity
                       where FlagsProperty & :flag = :flag
                       ")
                      .SetParameter("flag", MyEnum.FlagValue)
                      .List<MyEntity>();

以下是我使用Criteria解决的问题:

Expression.Eq(
  Projections.SqlProjection("({alias}." + propertyname + " & " + 
    ((int)value).ToString() + ") as " + propertyname + "Result",
    new[] { propertyname + "Result" },
    new IType[] { NHibernateUtil.Int32 }
  ), value );

您正在寻找Expression.Or如果要查询2倍的值或者Expression.Disjunction如果你要查询超过2个值:

criteria.Add(
  Expression.Disjunction()
    .Add(Expression.Eq("property", value1))
    .Add(Expression.Eq("property", value2))
    .Add(Expression.Eq("property", value3))
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM