【问题标题】:nhibernate c# criteria to retrieve null valuesnhibernate c#条件来检索空值
【发布时间】:2013-04-17 08:02:02
【问题描述】:

我需要从 oracle db 中检索状态文件 = 10 且空值形成可为空的 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);

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

我该怎么做?

【问题讨论】:

  • 你能更清楚地解释一下你想要什么吗?你想要StatusFile = 10 OR StatusFile IS NULL吗?
  • 嗨。我需要同时检索 StatusFile = 10 和 StatusFile 为空。

标签: c# nhibernate


【解决方案1】:

你试过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 中没有索引(至少几年前我使用它时),并且在大表中查找空值可能非常慢。

【讨论】:

【解决方案2】:
ICriteria criteria = NHibernateSession.CreateCriteria(persitentType);  
criteria.Add(Restrictions.Or (
    Restrictions.Eq ("StatusFile", 10), 
    Restrictions.IsNull ("StatusFile)
));

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2012-12-12
      • 1970-01-01
      • 1970-01-01
      • 2016-10-25
      • 1970-01-01
      • 2014-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多