nhibernate c#标准来检索空值

时间:2013-04-17 08:02:02

标签: c# nhibernate

我需要检索状态文件= 10的文件,并且null值从oracle db中形成一个可空的VARCHAR2列。

经过一番搜索,我发现了以下内容:

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

在sql中会是这样的:

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

如果我删除最后一行,它可以工作,但我找不到添加空值标准的方法。

我怎么能这样做?

3 个答案:

答案 0 :(得分: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"));

请注意,在oracle中没有索引空值(至少在几年前我使用它时),并且在大型表中找到空值可能会非常慢。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

的.List() 既然Stefan Steinegger的回答是'和'你的批评,你为什么不尝试脱离('或')? 像这样的东西, -

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>();