linq – 与NHibernate和Oracle的Bitwise AND

我正在使用Fluent NHibernate 1.0RC(对于NHibernate 2.1.4000)以及
Linq 2 NHibernate,我想用按位和操作执行查询.我第一次尝试使用这样的Linq,但这不起作用:

var objects = _session.Linq<MyClass>()
                      .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<MyClass>();

这也不起作用.它给了我一个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<MyClass>();

可能,Oracle有一个类型转换问题,因为BITAND返回一个很少使用的数据类型.如果是这种情况,请将HQL查询修改为:

select c from MyClass c 
    where bitand(c.someInteger, :param) + 0 > 0
点赞