C# NHibernate查询超过NullReferenceException
我有下面的QueryOver,当newExam.ActiveTo为null时抛出NullReferenceException(ActiveTo类型为DateTime?)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
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端发送所需的限制
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>();