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

时间:2014-07-28 10:05:38

标签: c# nhibernate fluent-nhibernate nullreferenceexception queryover

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

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

可以找到一个类似的问题here,但没有帮助我。

看起来Where子句中的懒惰评估似乎没有发生。 我感觉到,我忽略了一些非常明显的东西,但似乎无法找到它。

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

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

1 个答案:

答案 0 :(得分:1)

使用QueryOver语法(请参阅16. QueryOver Queries)应如下所示:

予。可空的财产

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

无关紧要,该属性可以为空。上面的语句只会采用这些行,这些行在DB中具有值,并且值等于searchedValue

II。搜索字符串

MyJoinedTable myJoinedTable = null;

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

上面我们可以看到我们首先使用JoinQueryOver加入MyJoinedTable,然后我们使用带有内置NHiberante方法的LOWER() IsInsensitiveLike(")