2016-09-20 10 views
2

Я использую Oracle как БД. Как преобразовать следующий запрос на спящий режим в QueryOver из NHibernate.Как использовать встроенные ключевые слова или функции Oracle в QueryOver из NHibernate в C#?

string condition = "RepositoryItemDO.RepositoryType = :REPTYPE AND 
24*(SYSDATE-RepositoryItemDO.FingerPrint.CreatingDateTime) >= :HOURS" 
        + " AND RepositoryItemDO.TargetEncryption IS NOT NULL AND RepositoryItemDO.TargetStorage IS NOT NULL"; 

Как написать синтаксис вышеуказанного запроса в QueryOver?

ответ

1

Вы можете использовать VarArgsSQLFunction для использования операции арифметики в QueryOver, а также для доступа к sysdate мы можем использовать NoArgSQLFunction, которая уже определена в OracleDilect.

Ниже приведен пример запроса, который вы можете попробовать использовать queryover

var func = Projections.SqlFunction(new VarArgsSQLFunction(NHibernateUtil.Double, "(", "-", ")"), NHibernateUtil.DateTime, Projections.SqlFunction("sysdate", NHibernateUtil.DateTime), Projections.Property<AdministrativeCaseEO>(c => c.EffectiveCasePeriod.EffectiveStartDate)); 

var parfunc = Projections.SqlFunction(new VarArgsSQLFunction(NHibernateUtil.Double, "(", "*", ")"), NHibernateUtil.Decimal, func, Projections.Constant(24)); 

var conjunction = Restrictions.Conjunction() 
.Add(Restrictions.Eq(Projections.Property<RepositoryItemDO>(c => c.RepositoryType), yourRefType)) 
.Add(Restrictions.IsNotNull(Projections.Property<RepositoryItemDO>(c => c.TargetEncryption))) 
.Add(Restrictions.IsNotNull(Projections.Property<RepositoryItemDO>(c => c.TargetStorage))) 
.Add(dateConj);