Побитовое И с NHibernate и Oracle - PullRequest
4 голосов
/ 13 февраля 2011

Я использую 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, которая вместо функции & будет ожидать функцию bitand ()?

1 Ответ

2 голосов
/ 13 февраля 2011

Вы можете расширить диалект Oracle и добавить BITAND в качестве распознанной функции 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...