我正在使用Fluent NHibernate 1.0RC(对于NHibernate 2.1.4000)以及
Linq 2 NHibernate,我想用按位和操作执行查询.我第一次尝试使用这样的Linq,但这不起作用:
var objects = _session.Linq()
.Where(x => (x.someInteger & otherInteger) > 0)
.ToList();
我的结论是Linq 2 Nhibermate不支持按位操作.所以我尝试使用HQL:
var objects = _session.CreateQuery("select c from MyClass c
where c.someInteger & :param > 0")
.SetParameter("param", otherInteger)
.List();
这也不起作用.它给了我一个ora-01036错误:“非法变量名称/号码”.
所以我的问题是:甚至可以使用NHibernate的按位运算吗?是否支持NHibernate 3.0开箱即用?这是有问题的,因为我使用的是Oracle DB,它会期望bitand()函数而不是&操作符?
最佳答案 您可以扩展Oracle方言并将BITAND添加为recoginzed HQL函数:
public class OraclePlusDialect : Oracle10gDialect
{
public OraclePlusDialect()
{
RegisterFunction("bitand", new StandardSQLFunction("bitand", NHibernateUtil.Int32));
}
}
然后你应该能够像这样执行你的查询:
var objects = _session.CreateQuery("select c from MyClass c
where bitand(c.someInteger, :param) > 0")
.SetParameter("param", otherInteger)
.List();
可能,Oracle有一个类型转换问题,因为BITAND返回一个很少使用的数据类型.如果是这种情况,请将HQL查询修改为:
select c from MyClass c
where bitand(c.someInteger, :param) + 0 > 0