2013-04-17 2 views
3

Мне нужно получить файлы с файлом состояния = 10, а нулевые значения образуют нулевой столбец VARCHAR2 из oracle db.nhibernate C# критерии для получения нулевых значений

После некоторых поисков я нашел следующее:

ICriteria criteria = NHibernateSession.CreateCriteria(persitentType); 
criteria.Add(Expression.In("StatusFile", 10)); 
criteria.Add(Restrictions.IsEmpty("StatusFile")); 

В SQL Server будет что-то вроде:

select attstatus from table where file_tmode = 'P'and (status is null or status = 10); 

Если удалить последнюю строку, она работает, но я не смог найти способ добавления критериев для нулевых значений.

Как я мог это сделать?

+0

Не могли бы вы объяснить, что вы хотите немного более ясно? Вы хотите, чтобы 'StatusFile = 10 ИЛИ StatusFile IS NULL'? –

+0

Привет. Мне нужно получить оба, StatusFile = 10 и StatusFile - null. – hikizume

ответ

4

Вы попробовали IsNull?

NHibernateSession.CreateCriteria(persitentType) 
    .Add(Expression.In("StatusFile", 10)) 
    .Add(Expression.IsNull("StatusFile")); 

с помощью or

NHibernateSession.CreateCriteria(persitentType) 
    .Add(Expression.In("StatusFile", 10) 
    || Expression.IsNull("StatusFile")); 

Обратите внимание, что Нуль- не проиндексирован в оракула (по крайней мере, несколько лет назад, когда я использовал его), и это может быть очень медленным, чтобы найти нулевые значения в большой таблице ,

+0

Этот способ не генерирует исключение, как тот, который у меня был, но nhibertate интерпретирует его «StatusFile in (10) и StatusFile имеет значение null», и он не извлекает никаких значений. – hikizume

+0

Вам нужна операция или операция? –

+0

вот объяснение для или: http://stackoverflow.com/questions/3299022/nhibernate-or-criteria-query –

2
ICriteria criteria = NHibernateSession.CreateCriteria(persitentType); 
criteria.Add(Restrictions.Or (
    Restrictions.Eq ("StatusFile", 10), 
    Restrictions.IsNull ("StatusFile) 
)); 
0

.list() Поскольку ответ Стефана Steinegger является 'and'ing вашим critieria, почему бы вам не попробовать дизъюнкции (' or'ing)? Что-то вроде этого, -

var query = Session.QueryOver<PersistentType>(); 
var disjunction = new Disjunction(); 
disjunction.Add(Restrictions.On<PersistentType>(obj => obj.statusFile == 10)); 
disjunction.Add(Restrictions.On<PersistentType>(obj => obj.statusFile == null)); 
var queryResult = query.Where(disjunction).List<PersistentType>(); 

Или просто,

var queryResult = Session.QueryOver<PersistentType>() 
    .Where(obj => obj.statusFile == 10 || obj.statusFile == null).List<PersistentType>(); 
Смежные вопросы