【问题标题】:Fluent NHibernate Querying: Check for nullable column values流畅的 NHibernate 查询:检查可为空的列值
【发布时间】:2014-07-28 10:05:38
【问题描述】:

我有以下问题:我的数据库表中有一个可为空的列。 我希望能够在 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() == "...");

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

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

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

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

【问题讨论】:

  • 你试过 simple ()=>myClass.Id == 0.5 吗?我很确定它应该可以工作

标签: c# nhibernate fluent-nhibernate nullreferenceexception queryover


【解决方案1】:

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

我。可空属性

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,然后我们使用SQLLOWER()和内置NHiberante方法IsInsensitiveLike(")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-17
    • 2017-10-19
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多