NHibernate QueryOver NullReferenceException

NHibernate QueryOver NullReferenceException

我有以下 QueryOver,它在 newExam.ActiveTo 为 null 时抛出 NullReferenceException(ActiveTo 类型是 DateTime?)

Exam examAlias = null;
examsInSameTime = session.QueryOver(() => examAlias)
                            .Where(() => examAlias.ActiveTo == null && newExam.ActiveTo == null)
                            .Future<Exam>();

当我将查询重写到此 HQL 时一切正常

var query = "from Exam exam where exam.ActiveTo is null and :newExamActiveTo is null)";
examsInSameTime = session.CreateQuery(query)                
            .SetParameter("newExamActiveTo", newExam.ActiveTo).List<Exam>();

为什么 QueryOver 会抛出异常而 HQL 不会?

正如 Radim 所写,您在 QueryOver 中使用了一个参数。问题是当你执行查询时 newExam 可能是 null

我想说,这里的解决方案应该非常简单和优雅(但前提是我正确阅读了您的问题)

重点是 - 在 C# 中检查您的参数,不要将其发送到数据库端:

Exam examAlias = null;
var query = session.QueryOver(() => examAlias);

//here we will check what needed
if(newExam.ActiveTo == null)
{
    query.Where(() => examAlias.ActiveTo == null)
}

// we can repeat that many times and build WHERE clause as required
...

// finally the query
examsInSameTime = query.Future<Exam>();

所以,这里的技巧是:

  • 检查应用端的搜索参数
  • 如果需要,将它们转换成 SQL WHERE 语句
  • 只在数据库端发送需要的限制