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

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

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

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

[Flags] enum Bar{ A = 0x01, B = 0x02, C = 0x04 } var criteria = this.Session.CreateCriteria() .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(); 

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

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

如果要查询2个值,则查找Expression.Or如果查询的值超过2个,则查找Expression.Or

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