Szt*_*upY 3 c# nhibernate enums flags criteria
如何进行HQL或Criteria搜索(后者是首选)涉及用作标志的枚举.换句话说,我有一个持久的枚举属性,存储某种标志.我想查询所有设置了这些标志之一的记录.使用Eq当然不会起作用,因为只有那是唯一的标志才会成立.
使用Criteria API解决这个问题是最好的,但是如果只使用HQL这样做也很好.
Bri*_*vez 12
以下是使用条件API执行此操作的方法:
[Flags]
enum Bar{
A = 0x01,
B = 0x02,
C = 0x04
}
var criteria = this.Session.CreateCriteria<Foo>()
.Add( BitwiseFlags.IsSet( "Bar", Bar.A | Bar.C ) );
Run Code Online (Sandbox Code Playgroud)
使用:
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, " & " );
}
}
Run Code Online (Sandbox Code Playgroud)
应该生成以下输出where子句:
FROM _TABLE
WHERE (this_.Bar & 5 = 5)
Run Code Online (Sandbox Code Playgroud)
这应该给你带有标志Bar.A和Bar.C设置的行(不包括其他所有内容).你应该能够将它与连接和分离一起使用.
HQL很简单:
var matching = session.CreateQuery(@"
from MyEntity
where FlagsProperty & :flag = :flag
")
.SetParameter("flag", MyEnum.FlagValue)
.List<MyEntity>();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3908 次 |
| 最近记录: |