流畅的NHibernate查询:检查可空的列值

本文关键字:检查 NHibernate 查询 | 更新日期: 2023-09-27 18:15:16

我有以下问题:我有一个可空列在我的数据库表。我希望能够在Where子句中为它添加一个过滤器。但是,当列实际上为空时,我得到一个错误:'对象引用未设置为对象的实例。'

public class MyClass
{
     public virtual float? Id { get; set; }
}
// When querying:
...
MyClass myClass = null;
var query = GetCurrentSession().QueryOver<MyClass>(() => myClass);
// The following all give the same null reference error.
(1) query.Where(() => myClass.Id.ToString() == "...");
(2) query.Where(() => myClass.Id.Value.ToString() == "...");
(3) query.Where(() => myClass.Id != null && myClass.Id.ToString() == "...");
(4) query.Where(() => myClass.Id != null && myClass.Id.Value.ToString() == "...");
(5) query.Where(() => myClass.Id.HasValue && myClass.Id.ToString() == "...");
(6) query.Where(() => myClass.Id.HasValue && myClass.Id.Value.ToString() == "...");

在这里可以找到一个有点类似的问题,但没有帮助我。

看起来Where子句内的惰性求值似乎没有发生。我有一种感觉,我在这里忽视了一些非常明显的东西,但似乎找不到它。

UPDATE:好吧,所以基于下面Novakov的建议,我能够修复可空浮点数比较问题。但是,对于(其他)字符串值仍然存在相同的问题。例如,我希望能够做这样的事情,即使我在查询中检查null,也会弹出相同的异常。

query.WhereRestrictionOn(() => myClass.MyJoinedTable.MyField.ToLowerInvariant()).IsLike("%test%");

流畅的NHibernate查询:检查可空的列值

使用QueryOver语法(参见16)。QueryOver Queries)应该像这样:

。nullable地产

query.Where(() => myClass.Id == searchedValue)

属性可为空并不重要。上面的语句将只接受这些在DB中有值且值等于searchedValue

的行。

二世。搜索字符串

MyJoinedTable myJoinedTable = null;
query
   ...
  .JoinQueryOver<MyJoinedTable>(() => myClass.MyJoinedTable, () => myJoinedTable)
  .WhereRestrictionOn(() => myJoined.Field)
      .IsInsensitiveLike("test", MatchMode.Anywhere);

上面我们可以看到,我们首先使用JoinQueryOver连接MyJoinedTable,然后我们使用SQL LOWER()与内置的nhibernate方法IsInsensitiveLike(")