C# NHibernate查询超过NullReferenceException

C# NHibernate查询超过NullReferenceException,c#,nhibernate,queryover,C#,Nhibernate,Queryover,我有下面的QueryOver,当newExam.ActiveTo为null时抛出NullReferenceException(ActiveTo类型为DateTime?) examilias=null; examsInSameTime=session.QueryOver(()=>examAlias) .Where(()=>examAlias.ActiveTo==null&&newExam.ActiveTo==null) .Future(); 当我将查询重写到此HQL时,一切正常 var quer

我有下面的QueryOver,当newExam.ActiveTo为null时抛出NullReferenceException(ActiveTo类型为DateTime?)

examilias=null;
examsInSameTime=session.QueryOver(()=>examAlias)
.Where(()=>examAlias.ActiveTo==null&&newExam.ActiveTo==null)
.Future();
当我将查询重写到此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>();
var query=“from Exam-Exam,其中Exam.ActiveTo为null,newExamActiveTo为null)”;
examsInSameTime=session.CreateQuery(查询)
.SetParameter(“newExamActiveTo”,newExam.ActiveTo).List();

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

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

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

关键是-检查C#中的参数,不要将其发送到DB端:

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>();
examilias=null;
var query=session.QueryOver(()=>examAlias);
//在这里,我们将检查需要什么
if(newExam.ActiveTo==null)
{
query.Where(()=>examAlias.ActiveTo==null)
}
//我们可以重复多次,并根据需要构建WHERE子句
...
//最后是查询
examsInSameTime=query.Future();
所以,这里的诀窍是:

  • 检查应用程序端的搜索参数
  • 如果需要,将它们转换为SQL WHERE语句
  • 仅在DB端发送所需的限制

但是,您的查询不一样,对吗?查询程序检查一些(最常见的)本地参数newExam。。。HQL创建SQL参数时,在DB端传递并检查该参数。。这是多余的。也许您应该重新考虑您的查询……但即使查询不完全相同,为什么QueryOver会抛出该异常?newExaim.ActiveTo==null有什么问题?我有多个选择条件,我想在查询中使用,这取决于一些本地参数newExam值是否为空。我想我明白你们想做什么。。。所以我试着在我的回答中表达。。。它应该向您展示如何拆分“参数”评估。。。这只是如何…而不是精确的解决方案。但老实说,我确实是这样解决查询的;)是的,newExam是QueryOver中的参数,但它肯定不是null。仅newExam.ActiveTo为null。当我在运行查询之前设置newExam.ActiveTo=DateTime.UtcNow时,查询返回的结果没有problems@Minarja试着把它放在一个临时变量中<代码>日期时间?dt=newExam.ActiveTo并在查询中使用
dt
对不起,
newExam.ActiveTo
类型已经是
DateTime?
,我的问题中有输入错误。我还尝试将其放入时态
dt
变量,但结果仍然是该异常。@Minarja您正在执行
未来
,因此不会立即使用数据。你能试试
列表()
?谢谢,你说得对!我最终得到了这个解决方案。我仍然很好奇,为什么我的问题中的原始查询会抛出异常,但动态地提出您的答案中的查询似乎比您所说的更好、更优雅。很高兴看到这一点,先生:)享受强大的NHibernate:)
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>();